Cにマルチスレッドのマージソーティングプログラムがあり、0、1、2、または4スレッドでベンチマークテストを行うためのプログラムがあります。また、Pythonで複数のテストを実行し、結果を集約するプログラムを作成しました。
奇妙なことに、Pythonを実行すると、シェルで直接実行する場合と比較して、テストは常に約半分の時間で実行されます。
たとえば、400万個の整数を並べ替えてテストプログラムを単独で実行すると(最後の2つの引数は、整数を生成するためのシードとモジュラスです):
$ ./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はどういうわけか実行を最適化していますか?それとも、私がそれを直接実行したときに、私が気付いていない何かがそれを遅くしていますか?