PDA

View Full Version : در مورد StringBuilder



Developer Programmer
جمعه 12 شهریور 1389, 10:21 صبح
در کتابهایی که توسط مایکروسافت به چاپ رسیده عنوان میشه که استفاده از روش

string a;
a="hel";
a+="o world";

باعث میشه که در هر بار که عمل الحاق صورت میگیره، شی قبلی Dispose بشه و شی جدید ساخته بشه. در نتیجه بهتره از StringBuilder استفاده بشه که Performance برنامه رو هم بالا میبره.

StringBuilder query = new StringBuilder();
query.Append("hello");
query.Append("world");
Console.WriteLine(query.ToString());


سئوال من اینه که اگه در استفاده از StringBuilder از عملگر الحاق هم استفاده کنیم، باز کارایی برنامه کم میشه؟ یا تفاوتی نمیکنه.

StringBuilder query = new StringBuilder();
query.Append("hello"+" world");
query.Append("\nwelcome"+" to" +" my program");
Console.WriteLine(query.ToString());

javad_r_85
جمعه 12 شهریور 1389, 10:59 صبح
مسلما در مدیریت حافظه تاثیر داره چون استرینگ بیلدر متناسب با الحاقات حافظه در نظر گرفته را بیشتر می کنه و متناسب با رشته برای آن حافظه قرار می دهد و برای اطلاعات رشته به صورت پویا عمل میکند.
و لی استریگ فضایی ایستا در نظر میگیری که ضرفیت رشته قابل تغییر نیست و مثلا زمانی که از+= استفاده می شه یک رشته جدید که از دورشته قبلی می باشد ایجاد میکند

حامد مصافی
جمعه 12 شهریور 1389, 11:07 صبح
در مثالي كه فرموديد فرقي نمي كند چون كامپايلر هوشمند C# به درستي آنهار ا بهينه كرده و تبديل به يك ثابت مي كند. اما در حالتي كه چند متغير را با هم الحاق كنيد متد سازنده string فراخواني شده و اوپراتور جمع روي آن اعمال مي شود و اين مقداري هدر دادن حافظه و همينطور منابع cpu است. اما گمان نمي كنم اين مقادير را با هيچ روشي بتوان اندازه گرفت، در واقع ناچيز هستند. تاكيد مايكروسافت در بر اين موضع به دليل رشته هاي حجيم است كه ممكن است مصرف حافظه را بي جهت بالا ببرند، براي مثال در يك برنامه كه روي داده هاي رشته اي حجيم عملي انجام مي دهد در صورت استفاده از روش اول عملاً فضايي متناسب با طول رشته آزاد اعلام شده و سپس فضاي بيشتري اختيار مي شود، كه تا عمل زباله روبي بعدي به همين ميزان فضاي مرده در رم خواهيم داشت.