前段时间在看 MapReduce 的实现时,突然想到的,我以前编程都是按照传统的编程方式进行的,别人说的什么针对多(核)CPU 优化等,对于我来说,就像浮云一样。我想,我是搞 .NET 开发的,所编写出来的程序是运行在那个沙箱里面,至于资源的分配调度等,它应该会帮我完成。
但是在看了 MapReduce 之后,我对他的伪分布式实现比较感兴趣,就是在单台机子上将计算拆分,然后启动N(N=CPU数量)个线程分别来执行。
但是,在 .NET 中,这样做真的能提升运算效率么?
于是,我做了一个简单的测试。
编写了两个程序,一个按照传统方式编程,一个根据伪分布式计算来进行优化,两个程序执行的算法和运算量相同。
于是,跑出了以下的数据:
传统方式:
1.482 ms
2.481 ms
3.477 ms
4.481 ms
5.523 ms -
6.475 ms
7.473 ms
8.477 ms
9.472 ms -
10.482 ms
平均时间:478.5 ms
伪分布式(多核CPU优化):
1.332 ms
2.359 ms -
3.311 ms -
4.345 ms
5.337 ms
6.355 ms
7.328 ms
8.325 ms
9.359 ms -
10.335 ms
平均时间:336.7 ms
(PS:一般的,双核CPU启动2个线程,但是如果双核CPU启动4个线程来执行相同计算工作量的代码,效率不会进一步提升了)
如果在计算工作量相当大的情况下,我相信第二个程序具有相当的优势。
看来,在某些方面,我以后的编程方式得做出一定的改变了。
最后附带3个测试程序。
SingleThread 是传统编程方式。
MultiThread 是针对双核优化的程序。
Multi2Thread 是用来测试继续拆分工作到多个线程(4个),是否还能提升效率。(他在双核下,将会和第二个程序达到差不多的效率,不过似乎还要稍微慢一些,但是如果你是4核CPU,那么,这个最快!)