سؤال

أنا أفهم فوائد StringBuilder.

ولكن إذا كنت أرغب في ربط سلسلتين، فأنا أفترض أنه من الأفضل (الأسرع) القيام بذلك بدون StringBuilder.هل هذا صحيح؟

في أي نقطة (عدد السلاسل) يصبح من الأفضل استخدام StringBuilder؟

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

المحلول

وأقترح ترحيبا حارا منكم قراءة مأساة حزينة المسرح الصغير الأمثل ، جيف اتوود.

وويعامل تسلسل بسيطة مقابل ب StringBuilder مقابل أساليب أخرى.

والآن، إذا كنت تريد أن ترى بعض الأرقام والرسوم البيانية، واتبع الرابط؛)

نصائح أخرى

ولكن إذا كنت أرغب في تسلسل سلسلتين ، فأنا أفترض أنه من الأفضل (أسرع) القيام بذلك بدون StringBuilder.هل هذا صحيح؟

هذا صحيح بالفعل، يمكنك أن تجد السبب موضحًا بشكل جيد للغاية على:

http://www.yoda.arachsys.com/csharp/stringbuilder.html

لخص :إذا كان بإمكانك ربط السلاسل دفعة واحدة

var result = a + " " + b  + " " + c + ..

أنت أفضل حالًا بدون StringBuilder لأنه يتم إجراء النسخ فقط (يتم حساب طول السلسلة الناتجة مسبقًا.)؛

لهيكل مثل

var result = a;
result  += " ";
result  += b;
result  += " ";
result  += c;
..

يتم إنشاء كائنات جديدة في كل مرة، لذلك يجب عليك التفكير في StringBuilder.

وفي نهاية المقال يلخص هذه القواعد الأساسية:

من البديهيات

لذا ، متى يجب أن تستخدم StringBuilder ، ومتى يجب أن تستخدم مشغلات سلسلة السلسلة؟

  • بالتأكيد استخدم StringBuilder عندما تكون متسلسلًا في حلقة غير تافهة - خاصةً إذا كنت لا تعرف بالتأكيد (في وقت الترجمة) كم عدد التكرارات التي ستجريها من خلال الحلقة.على سبيل المثال ، فإن قراءة ملف حرف في وقت واحد ، فإن إنشاء سلسلة أثناء استخدامك باستخدام += المشغل من المحتمل أن يكون انتحارًا للأداء.

  • بالتأكيد استخدم مشغل التسلسل عندما يمكنك (بشكل قارئ) تحديد كل ما يجب تسلسله في بيان واحد.(إذا كان لديك مجموعة من الأشياء المخصصة ، فكر في استدعاء string.concat بشكل صريح - أو string.join إذا كنت بحاجة إلى محدد.)

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

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

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

وSystem.String هو كائن غير قابل للتغيير - وهو ما يعني أنه كلما قمت بتعديل مضمونه أنه سيتم تخصيص سلسلة جديدة، وهذا يستغرق وقتا طويلا (والذاكرة؟). استخدام ب StringBuilder يمكنك تعديل المحتوى الفعلي للكائن دون تخصيص واحدة جديدة.

وحتى استخدام ب StringBuilder عندما كنت في حاجة للقيام العديد من التعديلات على السلسلة.

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

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

  • في حالة التسلسل في حلقة، استخدم دائمًا a StringBuilder.
  • إذا كانت السلاسل كبيرة، فاستخدم دائمًا a StringBuilder.
  • إذا كان رمز التسلسل مرتبًا وقابلاً للقراءة على الشاشة، فمن المحتمل أن يكون الأمر على ما يرام.
    إذا لم يكن كذلك، استخدم StringBuilder.

لإعادة صياغة

<اقتباس فقرة>   

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

وأنا عموما استخدام باني سلسلة لأي كتلة من التعليمات البرمجية التي من شأنها أن تؤدي إلى سلسلة من ثلاثة أو أكثر من السلاسل.

  • إذا قمت بتسلسل السلاسل في حلقة، يجب أن تفكر في استخدام StringBuilder بدلاً من String العادية
  • في حالة وجود سلسلة واحدة، قد لا ترى الفرق في وقت التنفيذ على الإطلاق

إليك تطبيق اختبار بسيط لإثبات هذه النقطة:

class Program
{
    static void Main(string[] args)
    {
        const int testLength = 30000;
        var StartTime = DateTime.Now;

        //TEST 1 - String
        StartTime = DateTime.Now;
        String tString = "test string";
        for (int i = 0; i < testLength; i++)
        {
            tString += i.ToString();
        }
        Console.WriteLine((DateTime.Now - StartTime).TotalMilliseconds.ToString());
        //result: 2000 ms

        //TEST 2 - StringBuilder
        StartTime = DateTime.Now;
        StringBuilder tSB = new StringBuilder("test string");
        for (int i = 0; i < testLength; i++)
        {
            tSB.Append(i.ToString());
        }
        Console.WriteLine((DateTime.Now - StartTime).TotalMilliseconds.ToString());
        //result: 4 ms

        Console.ReadLine();
    }
}

نتائج:

  • 30.000 تكرار

    • سلسلة - 2000 مللي ثانية
    • StringBuilder - 4 مللي ثانية
  • 1000 التكرار

    • سلسلة - 2 مللي ثانية
    • StringBuilder - 1 مللي ثانية
  • 500 التكرار

    • سلسلة - 0 مللي ثانية
    • StringBuilder - 0 مللي ثانية
<اقتباس فقرة>   

ولكن إذا أريد لسلسلة 2 سلاسل، ثم أفترض أنه من أفضل وأسرع للقيام بذلك دون ب StringBuilder. فهل هذا صحيح؟

نعم. ولكن الأهم من ذلك، هو أكثر بكثير <م> قراءة استخدام String الفانيليا في مثل هذه الحالات. استخدامه في حلقة، من ناحية أخرى، من المنطقي ويمكن أيضا أن تكون قابلة للقراءة مثل سلسلة.

وسأكون حذرا من قواعد الإبهام أن نذكر أرقام محددة من سلسلة باعتباره عتبة. استخدامه في حلقات (وحلقات فقط) هو على الارجح مثلما مفيد وأسهل للتذكر وأكثر منطقية.

وطالما يمكنك كتابة جسديا عدد تسلسالت (أ + ب + ج ...) لا ينبغي أن تحدث فرقا كبيرا. N مربع (في = N 10) هو تباطؤ 100X، التي لا ينبغي أن تكون سيئة للغاية.

والمشكلة الكبرى هي عندما كنت وصل مئات من السلاسل. وفي N = 100، تحصل على مرات التباطؤ 10000X. وهو أمر سيء جدا.

وأنا لا أعتقد أن هناك خط رفيع بين عند استخدام أو عندما لا تكون ل. ما لم يكن بالطبع يؤديها شخص بعض الاختبارات واسعة للخروج مع الظروف الذهبية.

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

وهناك سلسلة واحدة لا يستحق باستخدام ب StringBuilder. لقد استعملت عادة 5 تسلسالت كقاعدة عامة من الإبهام.

ال StringBuilder توفر الفئة للمطور مجموعة من الأساليب التي تسمح بمعالجة سلسلة من الأحرف القابلة للتغيير، ويمكن استخدامها عندما تريد تعديل سلسلة دون إنشاء كائن جديد، وبالتالي التخلص من مشكلة الحمل أو عنق الزجاجة لتسلسل السلسلة العادي.

باستخدام StringBuilder يمكن للفئة تعزيز الأداء عند تسلسل العديد من السلاسل معًا في حلقة.

فيما يلي قائمة ببعض العمليات التي يمكن إجراؤها لمعالجة سلسلة باستخدام فئة StringBuilder في .NET

ألحق:إلحاق المعلومات بنهاية StringBuilder الحالي.

إلحاق تنسيق:يستبدل محدد التنسيق الذي تم تمريره في سلسلة بنص منسق.

إدراج:إدراج سلسلة أو كائن في الفهرس المحدد لـ StringBuilder الحالي.

يزيل:إزالة عدد محدد من الأحرف من StringBuilder الحالي.

يستبدل:يستبدل حرفًا محددًا في فهرس محدد.

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