WEB开发网
开发学院软件开发C语言 0.033秒的艺术 --- the Cost of System.Math 阅读

0.033秒的艺术 --- the Cost of System.Math

 2009-05-18 08:28:14 来源:WEB开发网   
核心提示:在对.net程序进行调试或者性能测试时,常常需要查看生成的IL代码,0.033秒的艺术 --- the Cost of System.Math,但仅仅有IL代码还是不够的,有时我们还希望查看CLR生成的最终asm代码,测试代码如下:array[i] = Math.XXX(array[i]);1. Math.Sqrt,

在对.net程序进行调试或者性能测试时,常常需要查看生成的IL代码,但仅仅有IL代码还是不够的,有时我们还希望查看CLR生成的最终asm代码。在VS里,可以非常方便的查看最终的asm代码:当程序执行到断点时,在代码窗口右键选择Go To Disassemble就可以。但是,当通过VS Debug程序时,为了方便调试,CLR通常不会生成最优化的代码。所以为了得到实际运行时的asm代码,还必须做以下设置:

1,在Release模式下编译代码;

2. 打开工程属性窗口,选择”Build”页面--- “Advanced”,弹出窗口的“Debug Info”项设置为”pdb-only”。

3. 打开Tools => Options => Debugging => General,保证Suppress JIT optimization on module load和Enable Just My Code处于未选中状态。

可以在这里找到关于配置的更多资料。

我对.net 数学库做了一系列测试,结果可谓喜忧参半。当然,不同机器上可能得到不同的asm代码,以下是我的测试配置:intel Q6600 + .net framework 3.5 sp1。下面就来看看System.Math下个函数的性能。测试代码如下:

array[i] = Math.XXX(array[i]);

1. Math.Sqrt, Math.Sin, Math.Cos是所能期望的最理想实现,三个函数分别直接映射为fsqrt, fsin和fcos三条浮点汇编指令,可以认为这3个函数与汇编代码的效率一样。

array[i] = Math.Sqrt(array[i]);
00000092  fild        dword ptr [eax+edx*4+8]
00000096  fsqrt           
00000098  fstp        qword ptr [ebx+edx*8+8]

array[i] = Math.Sin(array[i]);
00000092  fild        dword ptr [eax+edx*4+8]
00000096  fsin            
00000098  fstp        qword ptr [ebx+edx*8+8] 

1 2 3  下一页

Tags:艺术 the Cost

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接