Параллелизм не решит проблем, связанных с процессором, но может помочь с проблемами ввода-вывода.
Многие люди считают, что могут повысить скорость своей программы, добавив некоторый уровень параллелизма. Это правда, а не правда. параллелизм может сделать ваш код медленнее, чем при его последовательном выполнении.
Что такое параллелизм для начала? параллелизм имеет дело с несколькими вещами одновременно. Он не запускает две задачи одновременно, это параллелизм. он запускает задачи в произвольном порядке, поэтому кажется, что они выполняются одновременно.
Параллелизм в основном достигается с помощью потоков системного уровня, которые распределены по доступным процессорам.
Параллелизм с потоками системного уровня требует переключения контекста. Некоторые языки пытаются избежать этого (Node.js), в то время как некоторые сокращают его, используя потоки пользовательского уровня (Go, Elixir), а некоторые просто используют его (Java *).
Стоимость переключения контекста - это хорошая цена за задачи ввода-вывода, но не за задачи, интенсивно использующие ЦП.
Познакомьтесь с нашими примерами функций
Мы разделим наши функции на 2 категории:
- Функции ЦП (последовательный и параллельный)
- Функция ввода-вывода (последовательная и параллельная)
Функции примера ЦП вызывают плохо написанную функцию Фибоначчи для имитации выполнения задачи, интенсивно использующей ЦП. Одна функция, cpuExampleSequential, последовательно запускает функцию Фибоначчи в цикле, а cpuExampleConcurrent выполняет функцию Фибоначчи в цикле одновременно.
Пример функции ввода-вывода вызывает структуру, реализующую `io.Reader`. Реализация этого считывателя делает вид, что выполняет длительный блокирующий вызов, спит в течение некоторого времени. Функция в этом примере вызывает читателя последовательно, а другая вызывает его одновременно.
Ниже представлена реализация примеров функций.
Теперь о некоторых тестовых функциях
Результат теста
Результат показывает следующее:
- Разница между последовательным и параллельным выполнением примеров ЦП невелика. Параллельный тест занимает немного больше времени.
- Существует 10-кратная разница между последовательным и параллельным выполнением функции ввода-вывода. параллельный вызов завершается примерно за 3 секунды, в то время как последовательный вызов функции занимает 30 секунд.
Причина
Начнем с CPU op. Причина этого довольно проста. Это потому, что единственный процессор, который у нас есть, большую часть времени тратит на работу. Нет вызова блокирующей операции, которая может выполняться в фоновом потоке. Одновременное выполнение задачи не улучшит ее производительность, но может замедлить ее из-за затрат на переключение контекста. В случае с Go переключение контекста практически отсутствует (но затраты на переключение горутин незначительны). Процессор всегда занят, и мы просто добавили ему нагрузки.
Одновременный вызов ввода-вывода выполняется в 10 раз быстрее, потому что функция read освобождает процессор при обращении к считывающему устройству. Это дает время другим горутинам работать с процессором. В случае последовательного вызова функция большую часть времени ожидает завершения работы считывателя перед вызовом следующего считывателя. Большая часть работы примеров ввода-вывода - это блокирующая операция, поэтому ЦП может выполнять другие задачи.
Заключение
Из приведенных выше примеров мы можем сказать, что параллелизм не улучшает производительность задач с интенсивным использованием ЦП, но мы можем использовать его для улучшения задач с интенсивным вводом-выводом.
Один из способов решения задачи с интенсивным использованием ЦП - использование нескольких процессоров. Это решает проблему за счет добавления дополнительных процессоров для выполнения задачи.
Примечание: используемый алгоритм должен быть написан для поддержки параллельного выполнения. У нас были случаи, когда добавление дополнительных процессоров замедляло работу системы. Случаи, когда все процессоры должны ждать блокировки, прежде чем они смогут выполнить задачу. Добавление процессоров в этом случае снизит производительность.
Есть и другие способы улучшить тяжелую задачу процессора. Некоторые :
- Пакетные вызовы, которые выполняют похожие задачи
- Кеширование ответа на дорогостоящую задачу
- Улучшение алгоритма
Подробнее о повышении производительности процессора Здесь.
Подробнее о стоимости переключения контекста см. Здесь. проверьте Здесь для более глубокого знания
Думаю, это конец ». Спасибо за прочтение.