#python #c #windows #cpu
#питон #c #Windows #процессор
Вопрос:
Я пытаюсь понять, что происходит, когда я запускаю несколько одинаковых процессов на многоядерном процессоре и как на самом деле это должно себя вести. Я запускаю все на ноутбуке с Windows 10, i7-10510U (4 ядра, MT 8 логических ядер)
Я начал анализировать проблему, когда многопроцессорная обработка Python (3.8.5) вызывала у меня неожиданное поведение. Я ожидаю, что если я запущу 3/4 процессов на 4-ядерном компьютере (давайте пока проигнорируем логические ядра) Я должен ускорить как минимум в 3 раза. Однако я увидел, что он ускоряется менее чем в 2 раза. Я провел некоторое тестирование с тривиальными проблемами. Я использовал простое хеширование для создания трудоемкой программы:
import hashlib
from timeit import default_timer as timer
start = timer()
for i in range(1,10000000):
hashlib.sha224(b"Nobody inspects the spammish repetition").hexdigest()
end = timer()
print(f'proj time: {end - start}')
Когда я запускаю это как один процесс, я получаю около 8 секунд. Если я запускаю 4 отдельных процесса вручную одновременно, время для каждого увеличивается примерно до 14 секунд, следовательно, на ускорение резко влияет время обработки одного процесса. Я подумал, что, возможно, что-то со временем выполнения Python (не должно, потому что все это отдельные процессы!), Поэтому попробовал аналогичный простой код на C :
#include <iostream>
#include <string>
#include <chrono>
#include <iomanip>
int main()
{
int noOfLoops = 300000000;
auto t1 = std::chrono::high_resolution_clock::now();
std::string sv = "Nobody inspects the spammish repetition";
std::string a;
for (int i = 0; i < noOfLoops; i ) {
a=std::hash<std::string>{}(sv);
}
auto t2 = std::chrono::high_resolution_clock::now();
float duration = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() / 1000.0;
std::cout << std::fixed << std::setprecision(3) << duration << std::endl;
system("pause");
}
Запуск этого дает около 10 секунд на моем компьютере. Но опять же, запуск этого режима 4 раза увеличивает время выполнения при одиночном запуске до 15 секунд.
Есть ли что-то, чего мне не хватает? Является ли это ожидаемым поведением с вашей стороны?
Комментарии:
1. Чего вы ожидаете? Как ОС должна планировать ваши процессы?
2. 4 processes использует все доступные ядра, поэтому у ОС и фоновых процессов нет альтернативы прерыванию ваших задач. Вы упомянули 3 процесса, но пробовали ли вы это? Как насчет 2? Это линейно? Что вам показывает диспетчер задач?
3. Если я запускаю их отдельно (например, щелкаю exe 4 раза) Я бы ожидал некоторого влияния на время выполнения, но не более 50% для одного процесса. Особенно, если нет таких блокировщиков, как ввод-вывод или другие, но может быть что-то, чего мне не хватает
4. Да, тоже пробовал 2/3. 2 будет работать нормально, 3 повлияет примерно на 25% на время выполнения. Я использую procexp, который показывает информацию, но лучше, чем диспетчер задач. Все отдельные процессы используют 12,5% от общей производительности (имеют 8 логических процессоров)