Параллелизм не решит проблем, связанных с процессором, но может помочь с проблемами ввода-вывода.

Многие люди считают, что могут повысить скорость своей программы, добавив некоторый уровень параллелизма. Это правда, а не правда. параллелизм может сделать ваш код медленнее, чем при его последовательном выполнении.

Что такое параллелизм для начала? параллелизм имеет дело с несколькими вещами одновременно. Он не запускает две задачи одновременно, это параллелизм. он запускает задачи в произвольном порядке, поэтому кажется, что они выполняются одновременно.

Параллелизм в основном достигается с помощью потоков системного уровня, которые распределены по доступным процессорам.

Параллелизм с потоками системного уровня требует переключения контекста. Некоторые языки пытаются избежать этого (Node.js), в то время как некоторые сокращают его, используя потоки пользовательского уровня (Go, Elixir), а некоторые просто используют его (Java *).

Стоимость переключения контекста - это хорошая цена за задачи ввода-вывода, но не за задачи, интенсивно использующие ЦП.

Познакомьтесь с нашими примерами функций

Мы разделим наши функции на 2 категории:

- Функции ЦП (последовательный и параллельный)

- Функция ввода-вывода (последовательная и параллельная)

Функции примера ЦП вызывают плохо написанную функцию Фибоначчи для имитации выполнения задачи, интенсивно использующей ЦП. Одна функция, cpuExampleSequential, последовательно запускает функцию Фибоначчи в цикле, а cpuExampleConcurrent выполняет функцию Фибоначчи в цикле одновременно.

Пример функции ввода-вывода вызывает структуру, реализующую `io.Reader`. Реализация этого считывателя делает вид, что выполняет длительный блокирующий вызов, спит в течение некоторого времени. Функция в этом примере вызывает читателя последовательно, а другая вызывает его одновременно.

Ниже представлена ​​реализация примеров функций.

Теперь о некоторых тестовых функциях

Результат теста

Результат показывает следующее:

  • Разница между последовательным и параллельным выполнением примеров ЦП невелика. Параллельный тест занимает немного больше времени.
  • Существует 10-кратная разница между последовательным и параллельным выполнением функции ввода-вывода. параллельный вызов завершается примерно за 3 секунды, в то время как последовательный вызов функции занимает 30 секунд.

Причина

Начнем с CPU op. Причина этого довольно проста. Это потому, что единственный процессор, который у нас есть, большую часть времени тратит на работу. Нет вызова блокирующей операции, которая может выполняться в фоновом потоке. Одновременное выполнение задачи не улучшит ее производительность, но может замедлить ее из-за затрат на переключение контекста. В случае с Go переключение контекста практически отсутствует (но затраты на переключение горутин незначительны). Процессор всегда занят, и мы просто добавили ему нагрузки.

Одновременный вызов ввода-вывода выполняется в 10 раз быстрее, потому что функция read освобождает процессор при обращении к считывающему устройству. Это дает время другим горутинам работать с процессором. В случае последовательного вызова функция большую часть времени ожидает завершения работы считывателя перед вызовом следующего считывателя. Большая часть работы примеров ввода-вывода - это блокирующая операция, поэтому ЦП может выполнять другие задачи.

Заключение

Из приведенных выше примеров мы можем сказать, что параллелизм не улучшает производительность задач с интенсивным использованием ЦП, но мы можем использовать его для улучшения задач с интенсивным вводом-выводом.

Один из способов решения задачи с интенсивным использованием ЦП - использование нескольких процессоров. Это решает проблему за счет добавления дополнительных процессоров для выполнения задачи.

Примечание: используемый алгоритм должен быть написан для поддержки параллельного выполнения. У нас были случаи, когда добавление дополнительных процессоров замедляло работу системы. Случаи, когда все процессоры должны ждать блокировки, прежде чем они смогут выполнить задачу. Добавление процессоров в этом случае снизит производительность.

Есть и другие способы улучшить тяжелую задачу процессора. Некоторые :

  • Пакетные вызовы, которые выполняют похожие задачи
  • Кеширование ответа на дорогостоящую задачу
  • Улучшение алгоритма

Подробнее о повышении производительности процессора Здесь.

Подробнее о стоимости переключения контекста см. Здесь. проверьте Здесь для более глубокого знания

Думаю, это конец ». Спасибо за прочтение.