11

我有一个 C 语言的多线程合并排序程序,以及一个用 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 程序使用 subprocess 模块调用测试器,然后解析和聚合输出。任何想法为什么会发生这种情况?Python是否以某种方式优化了执行?或者当我直接运行它时是否有一些我不知道的东西减慢它?

代码:https ://gist.github.com/2650009

4

2 回答 2

2

原来我将 sys.maxint 作为生成随机数的模数传递给子进程。C 正在截断 64 位整数并将其解释为有符号,即二进制补码中的 -1,因此每个随机数都被它修改并变为 0。因此,对所有相同的值进行排序似乎需要大约一半很多时间作为随机数据。

于 2012-05-11T01:56:19.590 回答
0

将其包装在 shell 脚本中可能会产生相同的效果。如果是这样,它的控制台操作

于 2012-05-10T00:19:24.983 回答