تحلیل و اولویتبندی ریسکهای کارایی (Performance Review) پیش از بهینهسازی زودهنگام
نویسنده: وحید نصیری
تاریخ: ۱۴۰۵/۰۵/۲۹ ۱۲:۴۶
آدرس: www.dntips.ir
این قطعه کد را از منظر ریسکهای کارایی و مقیاسپذیری بررسی کن.
الزامات و مراحل تحلیل:
۱. فعلاً کدی را بازنویسی نکن.
۲. موارد زیر را به صورت دقیق شناسایی کن:
۳. یافتهها را بر اساس میزان تأثیرگذاری بر گلوگاه سیستم (Impact vs. Effort) رتبهبندی کن.
foreach (var order in orders)
{
var customer = customers.First(x => x.Id == order.CustomerId);
Process(order, customer);
}First در هر تکرار حلقه، لیست مشتریان را به صورت خطی پیمایش میکند. اگر تعداد سفارشها N و مشتریان M باشد، تعداد کل بررسیها N * M خواهد بود.First به جای FirstOrDefault در صورت عدم وجود مشتری منجر به پرتاب خطای InvalidOperationException میشود.// ساخت دیکشنری با زمان زمانی O(M) و واکشی O(1)
var customersById = customers.ToDictionary(x => x.Id);
foreach (var order in orders)
{
if (customersById.TryGetValue(order.CustomerId, out var customer))
{
Process(order, customer);
}
else
{
logger.LogWarning("Customer with ID {CustomerId} not found for order {OrderId}.", order.CustomerId, order.Id);
}
}customers شامل ۱۰ آیتم باشد، ساخت Dictionary سربار تخصیص حافظه (Allocation) بیشتری نسبت به یک جستجوی ساده خطی دارد. اما در مجموعههای چندهزارتایی، دیکشنری تفاوت فاحشی در سرعت ایجاد میکند.BenchmarkDotNet بنویسد تا میزان تخصیص حافظه (Allocated Bytes) و زمان اجرای دو حالت به صورت علمی و قطعی مقایسه شود:Generate a BenchmarkDotNet harness to compare the linear search vs Dictionary lookup for various collection sizes (10, 100, 10000).orders و customers در پایگاه داده قرار دارند، به جای بارگذاری همه در حافظه و ساخت دیکشنری، راهحل واقعی انتقال این رابطه به کوئری SQL از طریق JOIN در EF Core است.