حتما با قانون Pareto آشنا هستید، همان قانون 80/20. به نظر میرسد این قانون در مورد Bottleneck های (ترجمه فارسی پیشنهاد شود لطفا!) نرم افزار نیز صدق می کند. بسیار دیده ام که با تغییر بخش کوچکی از کد، کارایی (Performance) نرم افزار به میزان قابل توجهی افزایش پیدا کرده است. سعی می کنم برخی از تجربیات خود را در این زمینه به اشتراک بگذارم. قطعا بیشتر دوستان و همکاران گرامی - که بیشتر آنها نسبت به من از تجربیات بسیار بالاتری برخوردارند – این مطالب را صرفا یادآوری تلقی می کنند. بیشتر مثال ها و نمونه ها به زبان C# و .Net Framework 2.0  خواهد بود.

کار با رشته ها:

کمتر کد نویسی پیدا میشود که با رشته ها کار نکرده باشد. یکی از کاربردهای رایج استفاده از رشته ها چسباندن متوالی رشته ها به یکدیگر است. به عنوان یک صورت مساله فرض کنید که می خواهیم یک فایل Comma Separated Value (CSV) بسازیم و برای این کار باید تعداد زیادی از رشته های کوچک را با فاصل کاما (,) به هم متصل (Concatenate) کرده و در یک فایل بنویسیم.

راه 1: استفاده از System.String

String s1 = “”;

foreach(string s2 in AnArrayOfStrings)

{

      s1 += s2;

}

 

راه 2: استفاده از System.Text.StringBuilder

StringBuilder s1 = new StringBuilder();

foreach(string s2 in AnArrayOfStrings)

{

s1.Append(s2);

}

 

مقایسه راه حل ها: پس از آزمایش راه حل ها به نتایج جالب توجهی خواهید رسید. نتیجه مقایسه دو راه حل برای افزودن 3000 رشته کوچک به یک رشته به شرح زیر است:

استفاده از System.String:    7147 میلی ثانیه

استفاده از System.Text.StringBuilder:    17 میلی ثانیه (!)

 

علت اختلاف زیاد دو راه حل این است که هنگام استفاده از System.String هر مرتبه که یک رشته به رشته ای الحاق می شود، رشته جدیدی (جدید s1) ایجاد می شود و رشته قبلی (s1 قدیمی) رها (Abandon) می شود و اشاره گر خود را از دست می دهد تا Garbage Collector آنرا پاکسازی نماید. شاید بسیاری از برنامه نویسان تعجب کنند که پس از اجرای تکه کد زیر 4 رشته جدید در حافظه به وجود خواهد آمد:

string s;

s = “a”;

s += “b”;

s += “c”;

s += “d”;