【发布时间】:2010-11-20 08:40:54
【问题描述】:
所以我敲了一些测试代码,看看多处理模块在 cpu 绑定工作上与线程相比如何扩展。在 linux 上,我得到了预期的性能提升:
linux(双四核至强): serialrun 耗时 1192.319 毫秒 并行运行耗时 346.727 毫秒 线程运行耗时 2108.172 毫秒
我的双核 macbook pro 显示相同的行为:
osx (双核 macbook pro) serialrun 耗时 2026.995 毫秒 并行运行耗时 1288.723 毫秒 线程运行耗时 5314.822 毫秒
然后我在一台windows机器上试了一下,得到了一些非常不同的结果。
windows (i7 920): serialrun 耗时 1043.000 毫秒 并行运行耗时 3237.000 毫秒 线程运行耗时 2343.000 毫秒
为什么,为什么,Windows 上的多处理方法这么慢?
这是测试代码:
#!/usr/bin/env python
导入多处理
导入线程
进口时间
def print_timing(func):
def 包装器(*arg):
t1 = time.time()
res = func(*arg)
t2 = time.time()
print '%s 耗时 %0.3f ms' % (func.func_name, (t2-t1)*1000.0)
返回资源
返回包装
定义计数器():
对于 xrange(1000000) 中的 i:
经过
@print_timing
def 串行运行(x):
对于 xrange(x) 中的 i:
柜台()
@print_timing
定义并行运行(x):
进程列表 = []
对于 xrange(x) 中的 i:
p = multiprocessing.Process(目标=计数器)
proclist.append(p)
p.start()
对于我在 proclist 中:
我加入()
@print_timing
def 线程运行(x):
线程列表 = []
对于 xrange(x) 中的 i:
t = threading.Thread(目标=计数器)
线程列表.append(t)
t.start()
对于线程列表中的 i:
我加入()
定义主():
串行运行(50)
并行运行(50)
线程运行(50)
如果 __name__ == '__main__':
主要()
【问题讨论】:
-
我在运行 Win2K3 的四核 Dell PowerEdge 840 上运行了您的测试代码,结果没有您的那么显着,但您的观点仍然有效:serialrun 耗时 1266.000 ms parallelrun 耗时 1906.000 ms threadedrun 耗时4359.000 ms 我很想看看你得到什么答案。我自己都不认识。