11

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はどういうわけか実行を最適化していますか?それとも、私がそれを直接実行したときに、私が気付いていない何かがそれを遅くしていますか?

コード:https ://gist.github.com/2650009

4

2 に答える 2

2

乱数を生成するための係数としてsys.maxintをサブプロセスに渡していたことがわかりました。Cは64ビット整数を切り捨てて、符号付き、つまり2の補数で-1と解釈していたため、すべての乱数がそれによって変更されて0になりました。したがって、同じ値をすべて並べ替えるには、次のように約半分かかるようです。ランダムデータと同じくらいの時間。

于 2012-05-11T01:56:19.590 に答える
0

これをシェルスクリプトでラップすると、おそらく同じ効果があります。もしそうなら、そのコンソール操作

于 2012-05-10T00:19:24.983 に答える