PDA

View Full Version : مقاله: StringBuilder چابکترین اما نه همیشه؟



#aliyari_C
پنج شنبه 24 تیر 1389, 00:08 صبح
مقدمه:

با عرض سلام و خدا قوت خدمت تمام برو بچ برنامه نویس , از آنجایی که سوالهای بساری در مورد کاربرد StringBuilder و نیز تفاوت آن با String همیشه مطرح می شود, من به دنبال مقاله در این باره می گشتم که جز تایپیکهای سوالی و بحث برانگیز به نتیجه ای کامل نرسیدم ,اما تایپیکی را در سایت CodeProject دیدم که مقوله ای کامل از مقایسه String و StringBuilder به طور کامل ارائه داد بود.

البته بنده آن چیزی را که در مقاله ایشان بود زیاد متوجه نشدم(شاید به دلیل حرفه ای بودنش) و از همین رو دست به تغییر و دستکاری هم در نمونه برنامه آقایAlois Kraus نمودم تا آن را به زبانی ساده تر بیان کنم.

منبع اصلی:http://www.codeproject.com/KB/cs/StringBuilder_vs_String.aspx



انجام آزمایش:

در این مقاله به مقایسه دو کلاس StringBuilder و String پرداخته شده که متدها و خاصیتهای مشابه شان را مورد مقایسه قرار داد ام.

این آزمایش با سیستمی با مشخصات زیر انجام شده:

1.با .NET 3.5

2.intel Pentium® 3.0 GHz * 2

3.MB Ram 512

نکته: البته برای اینکه برنامه را در سیستم خودم اجرا کنم , سیستم عامل آنرا به حالت SafeMode بورده ام.تا فقط برنامه خودم با CPU فعل و انفعال داشته باشد (برنامه های آنتی ویروس و... غیرفعال شوند)

نکته:البته در حالت SafeMode برنامه اجرایش نسبت به حالت Normal Windows بیشتر طول می کشد.

خوب برای شروع ما رشته به نام "The quick brown fox jumps over the lazy dog" داریم که قرار است تا آخر داستان با این رشته سرو کله بزنیم.

اولین آزمایش مربوط به مقایسه رشته ها بین دو تابع string.compareو string.copareordinal می باشد

نتـــایـــــج:

که هر حلقه طبق فرمول (تعداد * 1000000 ) اجرا می شود و زمان هم همان ثانیه است.


مثلا تعداد 150 بار یعنی:


Stopper.Iterations = 150000000;



http://up.iranblog.com/Files/b2cf33b70ca24c9c9fce.jpg



آزمایش دوم مربوط به مقایسه دو تابع String.Remove و String.RemoveBuilder

نتـــایـــــج:

در مرحله ما فقط با یک بار حلقه 5000000 را اجرا می کنیم ولی در Remove کردن کاراکترها را افزایش داده ایم.
مثلا تعداد 15 کاراکتر یعنی




Stopper.Iterations = 5000000;
Stopper.RemoveCount = 15;
Stopper.CheckRemove("String.Remove 15 char", StringRemove);
Stopper.CheckRemove("StringBuilder.Remove 15 char", StringBuilderRemove);



http://up.iranblog.com/Files/9121d74631c14625a09c.jpg



آزمایش سوم مربوط به مقایسه دو تابع String.Insert و StringBuilder.Insert می باشد.

نتـــایـــــج:

در این مرحله نیز مانند مرحله قبل با یک بار حلقه 5000000 اجرا می کنیم ولی در Insert کردن 3کاراکتر بالا می رویم
مثلا تعداد 7 کاراکتر یعنی:




Stopper.Iterations = 5000000;
Stopper.StringInserts = new string[7] { "brown ", "quick ", "The ", "brown ", "quick ", "brown ", "quick " };
Stopper.CheckInsert("String.Insert The, quick, brown (7)", StringInsert);
Stopper.CheckInsert("StringBuilder.Insert The, quick, brown (7)", StringBuilderInsert);



http://up.iranblog.com/Files/0081cbcce83f41cf8e7a.jpg



</div> آزمایش سوم مربوط به مقایسه دوتابع String.Replace وStringBuilder.Replace می باشد
نتـــایـــــج:

در این مرحله قرار است واژه ای را با واژه ای دیگر جاگزین کنیم , البته در رفتن به مرحله بعد واژهای مرحله قبل هم به اضافه واژه همان مرحله جایگزین می شود

مثلا در مرحله یک واژه slow جایگزین واژه quick می شود در مرحله دو هم واژه slow جایگزین واژه quick می شود و هم واژه busy جایگزین lazy می شود.

http://up.iranblog.com/Files/d61f21408ee94344b5ee.jpg


آزمایش چهارم مربوط به مقایسه دو تابع String.Format و StringBuilder.Format</div>
نتـــایـــــج:
و در این مرحله ساده ترین نوع Format رشته ای را انجام می دهیم و قصد پیچیده سازی نداریم و نیز یا یک حلقه 500000 اجرا ولی هر مرحله فراخوانی تابع StringFormat و StringBuilderFormat را افزایش می دهیم


دراینجا ما دو واژه First و Second را داریم که قرار است با فرمت بندی آن را داخل جمله مورد نظر بگذاریم.



object[] str=new object[2]{ "First", "Second" };
string.Format("Formatting {0} and {1} into string", str);





یعنی First جای خانه 0 و Second جای خانه 1 می نشیند.

http://www.free-picture-host.com/images/yXUqY41279133595.jpg


آزمایش پنجم مربوط به مقایسه "+" (روش سنتی) ,Join,Concat,StringBuilder.Append

نتـــایـــــج:

در اینجا ما یک حلقه 50000000 اجرا داریم که دراین مرحله ما آرایه داریم که قرار است در رشته مورد نظر اضافه کنیم . به طور معمول از روش “+” در String استفاده می شود ولی می توان از دو تابع دیگر Concat و Join برای الصاق رشته استفاده نمود

در این مرحله ما با افزایش آرایه خود کارایی آنها را آنالیز می کنیم.

نکته:هردو تابع زیر نتایج یکسانی را بر می گردانند.(string یک آرایه است).



String.Join(String.Empty, strings);
String.Concat(strings);


http://up.iranblog.com/Files/66b8d3388cf24f87b208.jpg



</div></div>

این هم برنامه اش (برنامه اصلی در سایت CodeProject می باشد)

http://www.barnamenevis.org/forum/downloads.php?do=file&id=82811&act=down


__________________________________________________ ___________________

چون به دریا می توانی راه یافت
سوی یک قطره چرا باید شتافـت