سؤال

ما هي القدرة الافتراضية ل StringBuilder?

ومتى يجب (أو لا ينبغي) استخدام الإعداد الافتراضي؟

هل كانت مفيدة؟

المحلول

لقد قدم المكرم J. السكيت تحليل جيد لهذه المشكلة بالتحديد:

https://jonskeet.uk/csharp/stringbuilder.html

نصائح أخرى

والقدرة الافتراضية ل StringBuilder هو 16 حرفا (كنت. NET العاكس لمعرفة).

والافتراضي هو 16، والتي يبدو أن القدرة الافتراضية في أي نوع من مجموعة أو قائمة في إطار .NET. عدد أقل من إعادة توزيع تحتاج على ب StringBuilder الخاص بك، كلما كان ذلك أفضل. وفي الوقت نفسه، فمن الضروري تخصيص أكثر من ذلك بكثير مما هو مطلوب أيضا.

وأنا عادة مثيل ب StringBuilder مع بعض نوع من تقدير تقريبي لحجم النهائي للب StringBuilder. على سبيل المثال، وهذا يمكن أن تستند على بعض عدد التكرار التي ستستخدمها في وقت لاحق لبناء سلسلة، أضعاف حجم الحاجة لكل عنصر في هذا التكرار.

// where 96 is a rough estimate of the size needed for each item
StringBuilder sb = new StringBuilder ( count * 96 );
for ( int i = 0; i < count; i++ )
{
...
}

عند حجم ل StringBuilder صغير جدا لكتابة سلسلة المقبلة، وتخصيص مجموعة شار الداخلية ب StringBuilder إلى ضعف حجمها الحالي.

وجاء هذا السؤال حتى اليوم كما نسخة مكررة من آخر، لكنني لاحظت لم يستجب جزء واحد. الافتراضي (على افتراض أن يعني "عندما لم تنشأ مع سلسلة كبيرة بما يكفي لتتطلب) هو 16 كما قال الناس، لكنني لا أرى أي شيء هنا على متى يجب تغييره.

ويمكنك تغييره عندما يمكنك القيام بذلك في التحسين ممكن. في الواقع، واختيار 16 هو عكس ذلك لتحسين الأداء. تحسين القيم واختيار والنهج وذلك لتناسب بشكل خاص قضية معينة أو مجموعة فرعية من الحالات المحتملة، (وليس "جعل الأمور أسرع" عموما، على الرغم من ان هذه هي الطريقة نحن غالبا ما تستخدم كلمة). هنا كان مصمم من الدرجة للتعامل مع التعميم - القيم اختيار والنهج وذلك لإعطاء أداء جيد بشكل معقول عبر مجموعة واسعة من الحالات

وأصغر ذهبوا، واستخدام أقل من الذاكرة.

وكلما ذهبوا، وأقل إعادة توزيع للتعامل مع سلاسل أكبر.

وهناك عدة أسباب لماذا الثنائية الشاملة (القوى كاملة من اثنين) من المحتمل أن تقدم أداء أفضل من أرقام أخرى في بعض الحالات، لذلك ذهبوا لواحد من هؤلاء، ولكن كان هذا جانبا الاختيار بين 4 أو 16 أو 1024 مسألة تحقيق التوازن بين القيم المرجح مختلفة.

شخص <م> باستخدام StringBuilder بدلا من تصميمه، قد يكون لديك فكرة أفضل عن ما حجم فمن المرجح أن تحتاج إليها.

إذا أنهم ذاهبون إلى Append 5 أرقام 1-أرقام جنبا إلى جنب مع السلاسل التي يبلغ مجموعها إلى 43 حرفا، ثم يبلغ الطول الإجمالي للStringBuilder سيكون 48 حرفا مهما كانت، ولذلك يجب استخدام قدرة 48 كما هو دائما 48 الحجم الأكثر كفاءة لسلسلة من 48 طول.

إذا يفعلون شيئا حيث يمكن أن يكون هناك أي طولها ما بين حوالي 23 و 34 حرف، ينبغي أن تستخدم 34.

إذا يفعلون شيئا حيث من المحتمل أبدا أن يكون هناك أكثر من 60 حرف، ولكن بين الحين والآخر يمكن أن يكون هناك، ينبغي أن تستخدم 64 (لا تخصيص لمعظم أجزاء، واكتساب القوة لطفلين صالح المذكورة أعلاه في الحالات القليلة التي لديك).

وإذا كان من المستحيل التوصل الى نتيجة حول هذا الموضوع، أو على الأقل من الصعب القيام بذلك، وليس أداء الساخنة، ثم عليك أن مجرد استخدام الافتراضي.

ويمكننا أن نجد القدرة باستخدام الخاصية قدرة الطبقة StringBuilder:

StringBuilder builder = new StringBuilder();
var capacity = builder.Capacity;
var maxCapacity = builder.MaxCapacity;

وهنا تحدد قدرة قدرة الافتراضي StringBuilder.

وStringBuilder هو Max Capacity هو نفس الحد الأقصى لقيمة Int32.

[تحرير: في ذلك الوقت، طرح السؤال حول StringList]

هل يعني StringCollection؟ هذا يستخدم ArrayList فارغة في البداية، وبالتالي فإن الجواب هو 0. وكان لديك أي خيار لتغيير ذلك. عند أول إضافة عنصر، والقدرة يقفز إلى 4، ثم يستخدم استراتيجية مضاعفة عندما يملأ.

إذا كنت تعني List<string>، فمن مماثل (لT[] فارغة، وليس ArrayList)، ولكن يمكنك تهيئة حجم تعرف إذا كنت في حاجة (أي أنك تعرف مقدار البيانات التي تتوقعها). مرة أخرى، وهي المرة الأولى التي تقوم فيها Add إلى List<T> حجم يقفز إلى 4، ثم يتضاعف كل مرة تمتلئ.

القدرة الافتراضية لمنشئ السلسلة هي 16 حرفا ، وسعة أقصى لباني الأوتار 2147483647 حرفا.

لذلك لا داعي للقلق بشأن تخزين الاستجابة الطويلة !!!

وقراءة نسمع عن ب StringBuilder قدرة ، هناك عينة التطبيق لاثبات ذلك أيضا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top