خب ما اومدیم تو این لینک  بررسی کردیم که مقدار شته ای تو سی شارپ رفتار Immutability داره که یه دور دیگه هم بخوایم خلاصه وار توضیح بدیم اینجوری بود که، وقتی ما یه مقدار جدید به متغیر از نوع رشته یا همون string میدیم، تو پشت صحنه میاد یه فضای جدید تو حافظه انتخاب میشه و مقدار تو اون ذخیره میشه و مقدار قبلی حذف میشه (با استفاده از garbage collection)، این روش خوبی ها و بدی هایی هم داشت که مهمترین خوبیش این بود که تو برنامه های چند نخی باگی به وجود نمیاره چون با هر تغییر یه آبجکت جدیدی برای ما وجود داره و بدی این موضوع ههم این بود که همین حذف از رم و اضافه کردن به یه جای جدید تو رم سربار زیادی برای سیستم میتونه داشته باشه.

ولی خب همیشه دات نت یه راه حل جایگزین یا روش دیگه ای هم برای اکثر کارا داره، که اگه با یه روشی حال نکردی بری سراغ روش دیگه ای. وقتی بخوایم یه یه رشته ای (متن) یه مقداری رو اضافه کنیم، میتونیم از قابلیت ​StringBuilder استفاده کنیم.

استفاده از StringBuilder برای اتصال یا رشته ها :

وقتی که ما از قابلیت StringBuilder استفاده میکنیم، دیگه تو پشت صحنه نمیاد برای هر تغییری تو رشته یه فضای جدید به متغیر بده و تغییرات رو تو فضای فعلی از حافظه انجام میده. یه مثال ببینیم از نحوه استفاده از این قابلیت

تو ایم مثال یه متنی رو 40 هزار بار به یه رشته اضافه مکنیم و زمان انجام رو هم محاسبه میکنیم.

میبینیم که 40 هزار بار تغییر تو یه رشته حدود 2 میلی ثانیه طول کشیده، همین آزمایش رو تو حالت عادی با رشته انجام دادیم حدود 5 ثانیه طول کشید! یه مقایسه انجام بدیم میبینیم که مقایسه سرعت این دو روش برای تغییرات وسیع روی رشته غیر قابل مقایسه هست.

مطالب مرتبط

DariaTech

مهدی نعمتی

04/22/2022 12:23:27

بررسی Immutable بودن String در سی شارپ

تو برنامه نویسی از نوع داده ای String برای ذخیره دیتای متنی استفاده میشه و تو سی شارپ برای ذخیره یک متن از آرایه ای از کاراکتر ها استفاده میشه که کاراکتر ها پشت هم تو آرایه ذخیره میشن و تبدیل به متن مورد نظر ما میشن. منظور از یک Immutable اینه که فضایی که برای نگه داری اطلاعات تو حافظه به اون متغیر اختصاص داده شده ثابته و تغییر نمی کند. تو سی شارپ نوع string یک نوع immutable هست. وقتی که بخوایم یک نوع immutable رو تغییر بدیم باید مقدار قبلی رو از حافظه پاک کنیم و توی حافظه یک فضای جدید برای این مقدار ایجاد کنیم. دلیل این کار هم اینه که بالا گفتیم، استرینگ یک نوع آرایه هست و طول آرایه نمیتونه متغیر باشه و ثابته و وقیت بخوایم مقدار استرینگ رو تغییر بدیم ناچاریم که طول آرایه رو هم تغییر بدیم. البته این حذف و اضافه شدن تو حافظه رو ما هیچوقت نمیبینم چون در واقع، هنگامیکه مقدار یک استرینگ تغییر می کنه، CLR یک بلوک جدید از خانه های حافظه را به اون اختصاص میده. منظور از CLR هم همون Common Language Runtime هست که به زبان ساده همون هسته مرکزی دات نت هست که اجرای برنامه های دات نت به عهده اونه. بالاخره هر چیزی یه خوبی و یه بدی داره میریم سراغ مزایا و معابش مزایای Immutable بودن String: از مهمترین مزیت های تغییر ناپذیر بودن یا Immutable اینه که Thread-safe هستن و در برنامه های چند نخی ایجاد باگ نمی کنن، یعنی وقتی تو سیستم های multi-threaded کار میکنیم دیگه مشکل deadlock و همزمانی رو نداریم چون تغییرات باعث ایجاد یک آبجکت جدید تو حافظه میشن. معایب Immutable بودن String: هر تغییر باعث ایجاد یک آبجکت جدید تو حافظه میشه که از نظر پرفرمنسی مشکل داره، چون هر سری یه زمانی برای ایجاد اون صرف میشه. یه مشکل دیگه هم اینه که مصرف رم بالا میره چون هر سری یه جدید ساخته میشه، ولی دات نت سیستم Garbage Collection داره که تا حد زیادی این مشکل رو درست میکنه. تو مقاله های بعدی یه سری توضیحاتی میدیم که ایم مشکلات حل بشن.

0 دیدگاه

ثبت دیدگاه

ایمیل شما نشر داده نمی شود

captcha