Определение: Задачи, где основное время выполнения тратится на процессорные вычисления.
Характеристики:
// Типичный CPU-bound пример
public double CalculatePi(int iterations)
{
double sum = 0.0;
for (int i = 0; i < iterations; i++)
{
double term = Math.Pow(-1, i) / (2 * i + 1);
sum += term;
}
return 4 * sum;
}
Определение: Задачи, где основное время тратится на ожидание операций ввода-вывода.
Характеристики:
// Типичный IO-bound пример
public async Task<string> FetchDataFromApiAsync(string url)
{
using var client = new HttpClient();
return await client.GetStringAsync(url); // Ожидание сетевого ответа
}
Характеристика | CPU-bound | IO-bound |
---|---|---|
Ограничивающий фактор | Процессорные ресурсы | Скорость подсистем IO |
Параллелизация | Эффективна | Эффективна до предела IO |
Оптимизация | Алгоритмическая | Асинхронность, кэширование |
Потребление CPU | 100% ядра | Малое (ожидание) |
Parallel.For(0, iterations, i =>
{
// Вычислительно сложный код
});
var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount };
Parallel.ForEach(data, options, item => Process(item));
public async Task ProcessDataAsync()
{
var data = await _dbContext.GetDataAsync();
await _fileService.SaveAsync(data);
await _notificationService.SendAsync();
}
var semaphore = new SemaphoreSlim(maxConcurrency);
await Task.WhenAll(tasks.Select(async task =>
{
await semaphore.WaitAsync();
try { await task; }
finally { semaphore.Release(); }
}));
Профилирование CPU:
Анализ времени:
var sw = Stopwatch.StartNew();
await SomeOperation(); // Если время ≈ времени ожидания IO - IO-bound
Calculate(); // Если время ≈ чистое процессорное время - CPU-bound
public async Task ProcessImageAsync(byte[] imageData)
{
// IO-bound часть
var compressed = await _cloudService.DownloadAsync(imageData);
// CPU-bound часть
var processed = await Task.Run(() => ApplyFilters(compressed));
// Снова IO-bound
await _db.SaveAsync(processed);
}
Рекомендация: Разделять разные по природе операции
CPU-bound:
IO-bound:
Главное правило:
Принцип: "Не заставлять потоки ждать там, где может ждать одна асинхронная операция"