توی این مطلب سعی کردم از زوایای مختلف به روشهای افزایش سرعت برنامه در C# بپردازم.
قسمتهایی که برای افزایش سرعت بررسی میکنم شامل: کار با string ها، Design Pattern های مرتبط، خوندن داده از دیتابیس و نکات مفید هستند.
تغییر یک string: در واقع رشتهها غیر قابل تغییر یا immutable هستند و وقتی برای جمع کردن متغیرهای رشته از عملگر + استفاده میکنید، در پشت صحنه یک فضای جدید در حافظه انتخاب میشه و مقدار جدید در اونجا قرار میگیره و مقدار قبلی توسط GC حذف میشه. اما با استفاده از StringBuilder تغییرات در فضای فعلی انجام میشه و فضای جدیدی ایجاد نمیشه.
مقایسه دو متغیر string: برای این کار بسته به موقعیت، روشهای مختلفی لازمه. در زیر موقعیتهای مختلف با بهترین روش رو نوشتم.
shortStringVar1.Equals(shortStringVar2);
longStringVar == shortStringVar;
string.Compare(stringVar1, stringVar2, ignoreCase: true);
در اصل الگوهای طراحی برای توسعه نرم افزار ها به صورت منعطف در برابر تغییر(flexible)، تعمیر پذیر(maintainable) و قابلیت استفاده دوباره(reusable) ایجاد شدند. اما برخی از الگو های طراحی علاوه بر این ویژگی ها از نظر سرعت هم به برنامه کمک میکنند که من اونهارو در زیر به صورت فهرست و با توضیحی خلاصه نوشتم.
البته که این توضیحات کوتاه برای یادگیری این الگوها کافی نیست. اگه علاقهمند به یادگیری بیشتر درمورد الگوهای طراحی هستید پیشنهاد من کتاب #Design Patterns in C نوشته شده توسط Vaskaran Sarcar و یا دوره C# Design Patterns توسط Kevin Dockx در سایت Pluralsight هست.
در استفاده از LINQ تا جایی که ممکنه شرطهای مورد نیاز رو قبل از متدهایی که نتیجه کوئری رو برمیگردونند(مثل ()First. و ()ToList. و ()Count. و ...) استفاده کنید. با اینکار شرطها در دیتابیس اجرا و فقط دادههایی که شرطهای مورد نیاز رو دارند از دیتابیس فراخونده میشن و نه تمام دادهها. درصورت نیاز میتونید شرطهای دیگهای بعد از این قرار بدید.
در دیتابیس ستون دادههایی که روی اونها زیاد عملیات جستجو انجام میدید INDEX کنید.
اگه از EFCore استفاده میکنید دو راه برای ایندکس کردن وجود داره استفاده از Data Annotation و یا Fluent API
برای مثال اگه میخواید از بین نام کاربریها زیاد جستجو انجام بدید میتونید از روشهای زیر استفاده کنید.
بالای پراپرتی مورد نظر از [Index] استفاده کنید.
[Index(IsUnique = true)] public string Username { get; set; }
از متد HasIndex استفاده کنید.
modelBuilder.Entity<User>().HasIndex(u => u.Username).IsUnique();