این مقاله به بررسی روشهای بهینهسازی مصرف حافظه در برنامههای .NET با استفاده از ویژگیهای جدید معرفی شده در نسخههای .NET 8 و .NET 9 میپردازد. نویسنده، نمانجا میهایلوویچ، تجربههای خود را در بهینهسازی سرویسی که از .NET Framework به .NET 8 و سپس به .NET 9 مهاجرت کرده است، شرح میدهد. او با استفاده از ابزارهای پروفایلینگ، نقاطی را که بیشترین میزان حافظه را تخصیص میدهند، شناسایی و با استفاده از APIهای جدید .NET، تخصیصهای غیرضروری را رفع کرده است.
در این مقاله، الگوهای کد متداول در .NET Framework که میتوانند منجر به تخصیص حافظه بیش از حد شوند، همراه با جایگزینهای مدرن و با کارایی بالا معرفی شدهاند. نویسنده تاکید میکند که قبل از شروع بهینهسازی، باید اطمینان حاصل شود که یک مشکل واقعی در عملکرد وجود دارد و بهینهسازیهای سطح پایین میتوانند اعتیادآور باشند و بدون دیدن نتایج قابل مشاهده، زمان زیادی را صرف آنها کرد. هر یک از مثالهای ارائه شده از مشکلات واقعی تخصیص حافظه که با استفاده از پروفایلر شناسایی شدهاند، گرفته شدهاند.
یکی از این روشها، فرمتبندی رشتهها است. روشهای قدیمی مانند الحاق رشته با استفاده از عملگر `+`، استفاده از `StringBuilder` و فراخوانی متدهای `string.Join`، `string.Concat` و `string.Format` میتوانند منجر به تخصیص حافظه بیش از حد شوند. در عوض، استفاده از فرمتبندی رشته با استفاده از اینترپولاسیون رشته (string interpolation) توصیه میشود. این روش هم از نظر سرعت و هم از نظر مصرف حافظه برتر است و همچنین خوانایی کد را افزایش میدهد. همچنین، استفاده از literalهای رشته خام (raw string literals) برای ایجاد رشتههای قالببندی پیچیده آسانتر شده است.
یکی دیگر از موارد مهم، مدیریت ظرفیت مجموعهها (collection capacity) است. مجموعههایی مانند `List` و `Dictionary` از آرایههایی با اندازه ثابت در پشت صحنه استفاده میکنند. وقتی این آرایه پر میشود، یک آرایه جدید بزرگتر تخصیص داده میشود و عناصر موجود به آن کپی میشوند. در حالی که کامپایلر و runtime معمولاً این کار را به طور بهینه انجام میدهند، در مواردی که از مقداردهی اولیه مجموعه (collection initializer) استفاده میشود، نیاز به کمک دستی وجود دارد. مشخص کردن ظرفیت دقیق مجموعه در زمان مقداردهی اولیه میتواند به طور قابل توجهی عملکرد را بهبود بخشد و مصرف حافظه را کاهش دهد.
مشاهده مطلب اصلی