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

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

 2009-05-18 08:28:14 来源:WEB开发网   
核心提示: 对于Math.Tan,最终仍然生成了fpan这样的cpu指令,0.033秒的艺术 --- the Cost of System.Math(3),但为什么和sin的差别会那么大呢,确实比较奇怪,自己编写一个简单的整数绝对值表达式要高效很多://asm code for Math.Abs(f

对于Math.Tan,最终仍然生成了fpan这样的cpu指令,但为什么和sin的差别会那么大呢,确实比较奇怪。至于另外剩下的函数,虽然算法不同,但实现的手段都是类似的,都是用非托管代码所写,并且可能导致多次对其他内部函数的调用。感兴趣可以用sos逐个查看。

3. Math.Abs. 这个函数比较特别,参数类型不同,所生成的代码也不同。对于浮点数来说,将会直接映射为浮点汇编指令fabs。对于int,却出乎意料的复杂。代码会想检查参数是否为负数,如果是,则需要进一步调用函数System.Math.AbsHelper,这是Math类的一个私有方法,它会进一步检查数据是否会溢出。如果不考虑安全性,自己编写一个简单的整数绝对值表达式要高效很多:

//asm code for Math.Abs(float/double)
00000086  fld         qword ptr [ebx+edx*8+8]
0000008a  fabs            
0000008c  fstp        qword ptr [ebx+edx*8+8]

//asm code for Math.Abs(integer)
0000008e  mov         ecx,dword ptr [eax+esi*4+8]
00000092  test        ecx,ecx
00000094  jl          0000009A
00000096  mov         eax,ecx
00000098  jmp         0000009F
0000009a  call        75F1E728  //call Math.AbsHelper if integer is a negative number
0000009f  mov         dword ptr [ebp-24h],eax
000000a2  fild        dword ptr [ebp-24h]
000000a5  cmp         esi,dword ptr [ebx+4]
000000a8  jae         00000286
000000ae  fstp        qword ptr [ebx+esi*8+8]

//asm code for Math.AbsHelper
00000000  push        ebp 
00000001  mov         ebp,esp
00000003  push        eax 
00000004  cmp         ecx,80000000h
0000000a  je          00725A00
00000010  neg         ecx 
00000012  mov         eax,ecx
00000014  mov         esp,ebp
00000016  pop         ebp 
00000017  ret         //return if no overflow occurred
00000018  mov         ecx,7994E990h
0000001d  call        FF83A548
00000022  mov         dword ptr [ebp-4],eax
00000025  mov         edx,790C1000h
0000002a  mov         ecx,70005A82h
0000002f  call        FF83A598
00000034  mov         ecx,eax
00000036  call        FF8641C8
0000003b  mov         edx,eax
0000003d  mov         ecx,dword ptr [ebp-4]
00000040  call        FFDCD44C
00000045  mov         ecx,dword ptr [ebp-4]
00000048  call        FF83A5B0
0000004d  int         3

//optimized unsafe abs:
 static public int FastAbs(int a)
{
    return (a >= 0) ? a : -a;
}

//asm code for unsafe abs which is inlined
00000091  mov         eax,dword ptr [ebx+ecx*4+8]
00000095  test        eax,eax
00000097  jge         0000009D
00000099  neg         eax 
0000009b  jmp         0000009D
0000009d  cmp         ecx,edx
0000009f  jae         00000296
000000a5  mov         dword ptr [ebx+ecx*4+8],eax 

4. Math.Max, Math.Min则是用普通托管语言编写的代码,没有特别优化,但这2个方法是inline的。

上一页  1 2 3 

Tags:艺术 the Cost

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