深入探讨用位掩码代替分支(9):测试成绩总结

一、测试结果汇总

  将前面的测试结果进行汇总,整理为表格(单位是毫秒,数值越小越好)——

测试f0_iff1_minf2_negf3_sarf4_mmxf5_sse
VC6 on 32bit2016206371967237.525.7
VC6 on 64bit2028207571868737.125.3
VC2010(32) on 32bit17932112512437  
VC2010(32) on 64bit17162106514437  
VC2010(64) on 64bit16231997421328  
C#2010(any) on 32bit192221472471559  
C#2010(any) on 64bit187119182406651  
C#2010(x86) on 32bit193021422462545  
C#2010(x86) on 64bit182920732340516  
C#2010(x64) on 64bit186519112399651  
VB6 on 32bit2844 1078   
VB6 on 64bit2839 1061   

注:CPU:Intel Core i3-2310M, 2100 MHz。

  对应图表——

  上图是以毫秒为单位,因数据量很多,看起来有点吃力。于是又做了一个表格,将各列的数据除以“f0_if”列,即以倍数为单位,数值越大越好——|

测试f0_iff1_minf2_negf3_sarf4_mmxf5_sse
VC6 on 32bit1.000.982.803.0053.7678.44
VC6 on 64bit1.000.982.822.9554.6680.16
VC2010(32) on 32bit1.000.853.504.10  
VC2010(32) on 64bit1.000.813.343.93  
VC2010(64) on 64bit1.000.813.864.95  
C#2010(any) on 32bit1.000.900.783.44  
C#2010(any) on 64bit1.000.980.782.87  
C#2010(x86) on 32bit1.000.900.783.54  
C#2010(x86) on 64bit1.000.880.783.54  
C#2010(x64) on 64bit1.000.980.782.86  
VB6 on 32bit1.00 2.64   
VB6 on 64bit1.00 2.68   

  对应图表(因MMX/SSE的性能太鹤立鸡群,影响图表阅读,故省略)——

 

二、各算法的性能分析

  现在我们按照列顺序(即各个算法的顺序)来进行分析——
1.首先,f0_if是采用if语句的基础算法,当作标杆用来评比其他算法。
2.f1_min采用了系统函数min、max。因现代编译器会对min、max做内联优化的,理论上应该与f0_if差不多。但实际测试后发现,f1_min比f0_if慢了一些。原因可能是因为min/max的语义与if不同,编译优化的深度不及if语句。
3.f2_neg算法采用了位运算来避免分支跳转,处理速度有了较大提高,平均性能大约是f0_if的3倍。可惜C#不支持将bool型强制转换为整型,而调用Convert.ToInt16带来了性能开销,使其比f0_if还慢。
4.f3_sar算法利用带符号移位避免了状态寄存器的访问,处理速度又有了一定的提升,平均性能大约是f0_if的3.5倍。
5.f4_mmx、f5_sse算法因为用到MMX、SSE这些SIMD指令集,所以处理速度比前面那些高级语言算法高了一个级别。

算法最小倍数最大倍数平均倍数备注
f1_min0.810.980.91无VB6
f2_neg2.643.863.09无C#
f3_sar2.864.953.52无VB6
f4_mmx53.7654.6654.21仅VC6
f5_sse78.4480.1679.3仅VC6


三、其他发现

  分析测试结果,还发现——
1.VC2010的的编译优化能力比VC6要强,同样程序的运行速度要快很多。这可能是因为VC2010的编译优化更能适应最新处理器的指令级并行性。
2.在64位系统中能运行32位程序,除了C#以外,其运行速度与在32位系统中的差不多。
3.C#2010的程序,有时在64位系统上的运行速度比32位系统还慢,甚至包括了“x64”平台方式编译的程序。似乎“x86”平台方式编译的程序的平均性能最好。可能是因为64位JIT(即时编译器)不如32位的成熟。
4.对于VC2010编译器来说,编译的64位程序比32位程序的运行速度有比较明显的提升。看来编写64位程序的最好还是用VC等C/C++编译器。
5.在传统印象中,VB、C#的运行速度比C语言慢很多。但通过这次测试发现,虽然它们的性能是有一定差距,但是是处于同一级别的,甚至C#与VC6打平还略占优势。影响程序运算速度的最关键因素是算法,用编译能力最差的VB6实现的f2_neg,比编译能力最好的VC2010实现的f0_if要快得多。


四、总结

  使用位掩码代替分支能带来较大的性能提升,而且该方案能推广到任何高级语言,能充分利用高级语言的可移植性,能满足大多数的性能优化需求。
  但当对性能要求极高、且不要求可移植性时,强烈推荐MMX、SSE等SIMD指令集,能使处理速度提高一个级别。

 

附:测试程序打包下载——

http://files.cnblogs.com/zyl910/noif_Test.rar
http://dl.dbank.com/c069c6thd7


(完)


《深入探讨用位掩码代替分支》系列文章——
1、利用带符号移位生成掩码:http://www.cnblogs.com/zyl910/archive/2012/03/12/noifopex1.html
2、汇编代码分析:http://www.cnblogs.com/zyl910/archive/2012/03/21/noifopex2.html
3、VC6速度测试:http://www.cnblogs.com/zyl910/archive/2012/03/27/noifopex3.html
4、VC2010速度测试:http://www.cnblogs.com/zyl910/archive/2012/03/28/noifopex4.html
5、C#2010速度测试:http://www.cnblogs.com/zyl910/archive/2012/03/29/noifopex5.html
6、VB6速度测试:http://www.cnblogs.com/zyl910/archive/2012/03/30/noifopex6.html
7、MMX指令集速度测试:http://www.cnblogs.com/zyl910/archive/2012/04/09/noifopex7.html
8、SSE指令集速度测试:http://www.cnblogs.com/zyl910/archive/2012/04/12/noifopex8.html
9、测试成绩总结:http://www.cnblogs.com/zyl910/archive/2012/04/13/noifopex9.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值