String Interning در C# چیست؟
در خیلی از app ها اکثر داده ها از نوع string است به همین خاطر نیاز به بهینه سازی هایی برای کاهش مصرف حافظه داریم. CLR از این بهینه سازی پیشتیبانی میکنه و اسم اون رو string interning گذاشته.
CLR یک hash table داخلی به نام Intern pool داره که ارجاعات واحدی به string literal ها داریم با کمک این بهینه سازی CLR از ایجاد اشیا رشته ای با iteral مشابه جلوگیری میکنه.
در مواردی که CLR بفهمه شما دارید تلاش میکنید یک نمونه string با یک literal ایجاد کنید که از قبل در hash table وجود داره از ارجاع مرتبط با string literal استفاده میکمنه و حافظه جدیدی تخصیص نمیده. CLR تصمیم گیری در رابطه با اینکه کدام Literal باید intern بشه و کدوم نباید بشه رو به عهده میگیره.
مثال:
اجرای دستی String Interning
string stringOne = "Hello World";
string stringTwo = "Hello World";
Console.WriteLine(object.ReferenceEquals(stringTwo, stringOne));
StringBuilder sb = new StringBuilder("Hello World");
StringBuilder sb1 = new StringBuilder();
string stringthree = string.Intern(sb.ToString());
string stringfour = string.Intern(sb1.Append("Hello World").ToString());
Console.WriteLine(object.ReferenceEquals(stringOne, stringthree));
Console.WriteLine(object.ReferenceEquals(stringOne, stringfour));
//true
//true
//true
حالا همه string ها از مکان حافظه یکسان stringOne ایجاد شده اند. مکان حافظه ایجاد شده توسط stringTwo,stringthree, stringfour برای فرآیند garbage collection آزاد خواهند شد.
متد IsInterned
متد String.IsInterned مشخص میکنه که رشته interned شده یا خیر.
string stringOne = "Hello World";
string stringTwo = "Hello World";
StringBuilder sb = new StringBuilder("Hello World");
StringBuilder sb1 = new StringBuilder();
string stringthree = string.Intern(sb.ToString());
string stringfour = string.Intern(sb1.Append("Hello World").ToString());
Console.WriteLine(string.IsInterned(stringfour + "12"));
Console.WriteLine(string.IsInterned(stringthree));
//
//Hello World
فقط دستور آخر اجرا میشود و مقدار Interned شده را بر میگرداند چون در دستور اول مقدار Hello World12 در intern pool نبود و لذا یک مقدار null (فضای خالی) بر میگردونه.
نتیجه گیری
String Interning یک تمرین خوب است چون برنامه را برای استفاده از حافظه کمتر بهینه می کند. ما فقط مقادیر غیر تکراری را ارجاع میدهیم و garbage collector اشیایی که برای مقادیر تکراری ایجاد شده اند را حذف می کند.
چون ما اشیا موجود را به جای اینکه از اول ایجاد کنیم ارجاع می دهیم زمان اجرا کاهش خواهد یافت.
مرجع