0.033秒的艺术 --- the Cost of System.Math
2009-05-18 08:28:14 来源:WEB开发网对于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的。
- ››TheServerSide网站2009年最热文章
- ››The Netron Project For vb.net
- ››The engine behind Splitter Flash game : workin...
- ››The engine behind Splitter Flash game – first...
- ››The engine behind Splitter Flash game – new A...
- ››艺术大于技术?《赵州桥》夜景灯光制作
- ››The Standard C Library for Linux
- ››The File System(文件系统)
- ››The Standard C Library for Linux:ctype.h
- ››The Standard C Library for Linux:stdlib.h
- ››The Model-View-Controller Architecture
- ››The Three Faces of SOA
更多精彩
赞助商链接