2012-05-09 3 views
11

私はマルチスレッドのmergesortingプログラムをC言語で、ベンチマーク用プログラムを0,1,2、または4スレッドでテストしています。また、Pythonで複数のテストを行い、結果を集約するプログラムを作成しました。CプログラムはPythonのサブプロセスより高速です

奇妙なことは、私がPythonを実行すると、シェルで直接テストを実行した場合と比較して、テストが常に約半分の時間で実行されることです。

Pythonスクリプトを使用して
$ ./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 

私はソートする400万整数(最後の2つの引数が整数を生成するためのシードとモジュラスある)を使用して自身でテストプログラムを実行する例えば

$ ./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

+10

Pythonコードを表示できますか? – NPE

+3

...とCコードもあります。または、少なくともgithubまたは同様のコードのポインタを提供してください。 –

+7

シェルからの実行により、プログラムがコンソールに印刷時間を過度に費やしているためですか? 'stdout'を'/dev/null'にリダイレクトして、それが状況を変えるかどうか確認してください。 –

答えて

2

私は乱数を生成するための法としてサブプロセスにsys.maxintを渡していました。 Cは64ビット整数を切り捨てて、2の補数で-1を符号付きとして解釈したので、すべての乱数はそれによってmod'dされ、0になりました。したがって、すべて同じ値をソートすると、ランダムなデータとして多くの時間。

0

はおそらく同じ効果を持つことになります。そうであればコンソール操作

+0

bashスクリプトでの折り返しは効果がありませんでした - まだPythonの2倍の遅さです。どのようなコンソール操作がパフォーマンスに大きな影響を与えますか? – scry

+0

出力のバッファリング。私は誰もがこれを解決するチャンスを持つためにPythonスクリプトを投稿する必要があると思う。 –

関連する問題