2010-07-31 19 views
6

Bilmek istiyorum - .NET JITter, diğer küçük işlevlerden çağrılan yinelemeli küçük işlevlere mi sahip olacak? olacak o satır içi tüm yol.NET JIT, başka bir küçük işlevi çağıran küçük bir işlev mi kullanıyor?

public static float Square(float value) 
{ 
    return value * value; 
} 

public static float Cube(float value) 
{ 
    return Square(value) * value; 
} 

bir yerden Cube ararsam, yoksa Square bir işlev çağrısı ile sona erecek:

Sadece örneğin

?

Ve eğer öyleyse, eğer inlining yapmak için ne kadar nüks olacaktır? (Aynı şekilde bir Quartic veya Quintic işlevini uygulamak için yeterince deli olduğumu söyle.)

cevap

10

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.

+1

İlginç ... çünkü XNA'da çalışıyorum, burada * her şey bir float! Biraz ilgili ... –

+0

* "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 –

+1

@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? –

İlgili konular