Ne yazık ki hatalı bir örnek seçtiniz. X86 JIT derleyicisi, float döndüren satır içi yöntemleri kullanmaz. % 100 emin değil neden, float FPU bir 80-bit kayan nokta değerine dönüştürülür zaman sürekli olarak sorunlardan kaçınmak için bence. Dahili hassasiyet 80 bittir, ancak bu bitler, 80 bit değeri, belleğe temizlendiğinde 32 bit değerine geri döndüğünde kesilir. FPU'daki değeri çok uzun tutmak, bu kesintinin gerçekleşmesini engeller ve hesaplama sonucunu değiştirir. ,
00000000 push ebp ; setup stack frame
00000001 mov ebp,esp
00000003 call 6DA2BEF0 ; Console.get_Out()
00000008 fld qword ptr ds:[010914B0h] ; ST0 = 8.0
0000000e sub esp,8 ; setup argument for WriteLine
00000011 fstp qword ptr [esp]
00000014 mov ecx,eax ; call Console.Out.WriteLine
00000016 mov eax,dword ptr [ecx]
00000018 call dword ptr [eax+000000D0h]
0000001e pop ebp ; done
0000001f ret
Bu sadece fonksiyonları satır içi vermedi:
çift ile yüzer değiştirip bu kodu derlemek: O zaman bu makine kodu JIT iyileştirici etkin olduğunda oluşturulur
static void Main(string[] args) {
Console.WriteLine(Cube(2.0));
}
ifadeleri derleme zamanında değerlendirmeyi başardı. Ve doğrudan Console.WriteLine (8.0) arayarak sonucu geçirir. Oldukça iyi ha?
Çiftli değil, yüzdürme kullanın.
İlginç ... çünkü XNA'da çalışıyorum, burada * her şey bir float! Biraz ilgili ... –
* "x86 JIT derleyicisi float döndüren satır içi yöntemleri yoktur." * - Bu konuda kesinlikle emin misiniz? Ben yüksek ve düşük arandı ve bu yedeklemek için herhangi bir referans bulamıyorum. Bulduğum en iyi şey şudur: Bağlan: https://connect.microsoft.com/VisualStudio/feedback/details/536781/unexpected-jit-inlining-behavior Çizgide. Ve bu (eski) makale, zorlayıcı kuralların (yani uygulamada farklı olabilir), yüzer ve çiftler için aynı olduğunu ima eder: http://blogs.msdn.com/b/davidnotario/archive/2005/08/08/449092. aspx –
@Andrew: satır içi kurallar belgelenmemiş, yalnızca bazı blog yazılarında belirtilmiştir. Önemli, çünkü belgelendirilmiş davranışlardan yapılan varsayımları kırmadan jitter'i iyileştirmek için bunu değiştirebilmeleri gerekir. Sadece x86 jitter'imi gördüğümü belgeleyebilirim. Ve kesinlikle bu yöntemlerin şamandıra sürümünü satır içi değil. Farklı davranışlar görüyor musunuz? –