一般而言,您不能認爲Single
的執行速度快於Double
。 Intel CPU上的浮點寄存器爲80位,CPU上的浮點運算使用該精度執行。在該平臺上,JIT可以生成浮點指令,將參數加載到本機80位寄存器中,唯一的區別是如果寄存器是從32位或64位存儲器位置加載的。也許Math.Min
的實現者基於它們的實現來了解JIT編譯器如何生成浮點代碼的複雜知識。
從接受的答案可以看出,問題是基於錯誤的假設(即從Single
到Double
)。爲了調查演員是否確實有所作爲,我看了一下Min
函數生成的彙編程序,有沒有演員。
這是.NET Framework Math.Min(Single, Single)
如被看見在我的調試器:
00000000 push ebp
00000001 mov ebp,esp
00000003 fld dword ptr [ebp+0Ch]
00000006 fld dword ptr [ebp+8]
00000009 fxch st(1)
0000000b fcomi st,st(1)
0000000d jp 00000015
0000000f jae 00000015
00000011 fstp st(1)
00000013 jmp 00000022
00000015 fcomi st,st(0)
00000017 jp 0000001B
00000019 je 00000026
0000001b mov eax,1
00000020 jmp 00000028
00000022 pop ebp
00000023 ret 8
00000026 xor eax,eax
00000028 test eax,eax
0000002a je 00000030
0000002c fstp st(1)
0000002e jmp 00000036
00000030 fstp st(0)
00000032 pop ebp
00000033 ret 8
00000036 pop ebp
00000037 ret 8
這裏是用強制轉換爲Double
的功能組件,就像在這個問題:
00000000 push ebp
00000001 mov ebp,esp
00000003 sub esp,8
00000006 fld dword ptr [ebp+0Ch]
00000009 fld dword ptr [ebp+8]
0000000c fld st(1)
0000000e fstp qword ptr [ebp-8]
00000011 fld qword ptr [ebp-8]
00000014 fld st(1)
00000016 fstp qword ptr [ebp-8]
00000019 fld qword ptr [ebp-8]
0000001c fcomip st,st(1)
0000001e fstp st(0)
00000020 jp 00000028
00000022 jbe 00000028
00000024 fstp st(0)
00000026 jmp 00000043
00000028 fxch st(1)
0000002a fcomi st,st(0)
0000002c jp 00000030
0000002e je 00000037
00000030 mov eax,1
00000035 jmp 00000039
00000037 xor eax,eax
00000039 test eax,eax
0000003b jne 00000041
0000003d fstp st(0)
0000003f jmp 00000049
00000041 fstp st(1)
00000043 mov esp,ebp
00000045 pop ebp
00000046 ret 8
00000049 mov esp,ebp
0000004b pop ebp
0000004c ret 8
還有幾條指令,這些可能會稍微降低功能的性能。
你從哪裏得到.NET Math.Min代碼?你反光了嗎? – Strillo 2012-03-27 08:35:25
是的,我使用了Resharper,它的確如此 – stfx 2012-03-27 08:38:35
我同意@Benny,我認爲性能差異可以忽略不計。 – gideon 2012-03-27 08:40:20