Что такое CPU-bound операция?

«Что такое CPU-bound операция?» — вопрос из категории Многопоточность, который задают на 28% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

CPU-bound (ограниченная процессором) — это характеристика операции или задачи, скорость выполнения которой в первую очередь определяется вычислительной мощностью CPU, а не скоростью других подсистем (ввода-вывода, памяти, сети).

Суть: Поток, выполняющий CPU-bound операцию, постоянно загружает ядро процессора вычислениями.

Типичные примеры CPU-bound операций:

  • Сложные математические расчеты (симуляции, алгоритмы машинного обучения).
  • Обработка изображений или видео (применение фильтров, кодирование).
  • Шифрование и хеширование данных.
  • Компиляция кода.
  • Алгоритмы сортировки или поиска по большим объемам данных в памяти.

Пример CPU-bound вычисления:

// Интенсивное вычисление числа Пи (метод Монте-Карло)
public double CalculatePi(int iterations)
{
    Random rand = new Random();
    int insideCircle = 0;
    for (int i = 0; i < iterations; i++)
    {
        double x = rand.NextDouble();
        double y = rand.NextDouble();
        if (x * x + y * y <= 1.0) insideCircle++;
    }
    return 4.0 * insideCircle / iterations;
}
// Вызов этой функции будет нагружать CPU.

Как работать с CPU-bound задачами:

  1. Параллелизм: Распараллеливание на несколько потоков или ядер для использования всего потенциала CPU.
    // Использование Parallel.For для параллельной обработки
    Parallel.For(0, data.Length, i =>
    {
        data[i] = PerformHeavyComputation(data[i]);
    });
  2. Асинхронность (осторожно!): Паттерн async/await сам по себе не ускоряет CPU-bound операции, так как не создает новых потоков. Однако он полезен, чтобы не блокировать UI-поток, вынеся задачу в фоновый поток с помощью Task.Run.
  3. Оптимизация алгоритмов: Часто самый эффективный способ — уменьшение вычислительной сложности алгоритма (с O(n²) до O(n log n)).

Противоположность: I/O-bound операции, где поток большую часть времени ожидает завершения операции ввода-вывода (запрос к БД, чтение файла, сетевой вызов). Для них оптимален асинхронный паттерн (async/await).