У меня есть многопоточная программа сортировки слиянием на C и программа для эталонного тестирования с 0, 1, 2 или 4 потоками. Я также написал программу на Python для выполнения нескольких тестов и агрегирования результатов.
Странно то, что когда я запускаю Python, тесты всегда выполняются примерно вдвое быстрее, чем когда я запускаю их непосредственно в оболочке.
Например, когда я запускаю тестовую программу саму с 4 миллионами целых чисел для сортировки (последние два аргумента — это начальное число и модуль для генерации целых чисел):
$ ./mergetest 4000000 4194819 140810581084
0 threads: 1.483485s wall; 1.476092s user; 0.004001s sys
1 threads: 1.489206s wall; 1.488093s user; 0.000000s sys
2 threads: 0.854119s wall; 1.608100s user; 0.008000s sys
4 threads: 0.673286s wall; 2.224139s user; 0.024002s sys
Используя скрипт python:
$ ./mergedata.py 1 4000000
Average runtime for 1 runs with 4000000 items each:
0 threads: 0.677512s wall; 0.664041s user; 0.016001s sys
1 threads: 0.709118s wall; 0.704044s user; 0.004001s sys
2 threads: 0.414058s wall; 0.752047s user; 0.028001s sys
4 threads: 0.373708s wall; 1.24008s user; 0.024002s sys
Это происходит независимо от того, сколько я сортирую или сколько раз запускаю. Программа Python вызывает тестер с модулем подпроцесса, затем анализирует и объединяет выходные данные. Любые идеи, почему это произойдет? Python как-то оптимизирует выполнение? или есть что-то, что замедляет его, когда я запускаю его напрямую, о чем я не знаю?