CodeShot
Performance2 دقیقه مطالعه

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 ابزارهای اصلی بهینه‌سازی هستند.

حالا امتحان کن

🧩آزمون Performance در .NET6 سؤال · نمره قبولی 60٪
این مطلب مفید بود؟
نشان کردن
مشاهده در Concept Hub ←