Performance در .NET چیست؟
بهینهسازی اجرای برنامههای .NET برای سرعت بیشتر، مصرف کمتر منابع و مقیاسپذیری بهتر — از مدیریت حافظه تا Async و Caching.
چرا مهم است؟
اکثر سوالات مصاحبه سطح Mid/Senior درباره Performance واقعاً درباره همین موارد است: چرا Allocation زیاد بد است، چرا Async مهم است و چطور Query دیتابیس را بهینه کنیم.
تعریف کوتاه
Performance در .NET یعنی بهینهسازی اجرای برنامه برای رسیدن به سرعت بیشتر، مصرف کمتر منابع (CPU/Memory)، مقیاسپذیری بهتر و پاسخدهی سریعتر.
مدیریت حافظه و GC
ایجاد بیشازحد Object باعث فشار روی Garbage Collector و کاهش Performance میشود. راهکارها: struct برای داده کوچک/Value Type · using برای Dispose منابع · Object Pooling برای کاهش Allocation.
using var connection = new SqlConnection();
GC حافظه Managed Heap را در چند نسل مدیریت میکند:
| Generation | کاربرد |
|---|---|
| Gen 0 | اشیای کوتاهعمر |
| Gen 1 | اشیای متوسط |
| Gen 2 | اشیای بلندعمر |
Allocation زیاد → اجرای بیشتر GC → کاهش سرعت؛ Objectهای بزرگ وارد Large Object Heap (LOH) میشوند و هزینه بیشتری دارند.
Async/Await صحیح
برای I/O (Database، API Call، File Access) از Thread Block جلوگیری میکند:
var users = await db.Users.ToListAsync(); // خوب
var users = db.Users.ToList(); // بد — Thread را بلاک میکند
بهینهسازی LINQ
از ToList() غیرضروری و چند بار پیمایش Collection خودداری کنید؛ تفاوت IEnumerable/IQueryable را بدانید.
// بهینهتر در سناریوهای حساس به Allocation:
foreach (var user in users)
if (user.IsActive) { /* process */ }
Database Performance
Index مناسب · جلوگیری از N+1 Query · Pagination · انتخاب فقط ستونهای موردنیاز:
context.Users.Select(x => new { x.Id, x.Name }).ToList(); // بهتر از context.Users.ToList()
Caching
In-Memory Cache و Distributed Cache (مثل Redis) برای جلوگیری از محاسبات/درخواستهای تکراری:
_memoryCache.Set("users", users);
کاهش Allocation
ابزارها: Span<T> · Memory<T> · ArrayPool<T> · ObjectPool
Span<int> numbers = stackalloc int[10];
String صحیح
String در .NET Immutable است؛ برای الحاق زیاد از StringBuilder استفاده کنید، نه += در حلقه:
var builder = new StringBuilder();
for (int i = 0; i < 1000; i++) builder.Append(i);
Threading و Parallelism
برای پردازش CPU-Intensive: Task Parallel Library، Parallel.For / Parallel.ForEach، BackgroundService.
Profiling و اندازهگیری
Performance بدون اندازهگیری قابل بهبود نیست: BenchmarkDotNet · dotnet-counters · dotnet-trace · Visual Studio Profiler.
[Benchmark]
public void TestMethod() => Calculate();
چکلیست سریعسازی یک API
Async همهجا · Cache کردن دادهها · کاهش Queryهای Database · Pagination · Compression · بهینهسازی Serialization · کاهش Object Allocation
نکته کلیدی: Performance در .NET یعنی مدیریت صحیح حافظه، کاهش Allocation، استفاده درست از Async، بهینهسازی Database و Cache، و اندازهگیری مداوم با ابزارهای Profiling.
خلاصه
- کاهش Allocation و Object غیرضروری مستقیماً فشار روی Garbage Collector و Performance را کم میکند.
- استفاده درست از Async/Await باعث آزاد ماندن Thread هنگام I/O و افزایش Throughput میشود.
- Index مناسب، جلوگیری از N+1 Query، Caching و Profiling با BenchmarkDotNet ابزارهای اصلی بهینهسازی هستند.
