[英]C program is faster as Python subprocess
我在C中有一個多線程mergesorting程序,以及一個用0,1,2或4個線程進行基准測試的程序。 我還用Python編寫了一個程序來進行多項測試並匯總結果。
奇怪的是,當我運行Python時,測試總是在大約一半的時間內運行,而不是直接在shell中運行它們。
例如,當我用400萬個整數運行測試程序進行排序時(最后兩個參數是生成整數的種子和模數):
$ ./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以某種方式優化執行嗎? 或者當我直接運行它時,有什么東西會減慢它我不知道的?
結果我將sys.maxint傳遞給子進程作為生成隨機數的模數。 C正在截斷64位整數並將其解釋為有符號,即在二進制補碼中為-1,因此每個隨機數都由此修改並變為0.因此,對所有相同值進行排序似乎需要大約一半很多時間作為隨機數據。
將它包裝在shell腳本中可能會產生相同的效果。 如果是這樣它的控制台操作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.