2013-03-30 21 views
6

C# 'de performans açısından kritik bir uygulama yazıyorum ve temel işlem ağırlık hesaplamalarıdır. tüm değişkenler erişilebilir, böylece tüm aramalar aynı sınıf içinde yapılırC# bu işlevleri inline edecek mi?

if (activationMethod == ActivationMethod.Binary) { 
    ForEachWeight((lower, upper, weight) => upperLayer.Values[upper] += weight; 
} else { 
    ForEachWeight((lower, upper, weight) => upperLayer.Values[upper] += lowerLayer.Values[lower] * weight); 
} 

:

public void ForEachWeight(Action<int, int, float> action) 
{ 
    for (int lower = 0; lower < LowerLayerSize; lower++) { 
     for (int upper = 0; upper < UpperLayerSize; upper++) { 
      action(lower, upper, Weights[(lower * UpperLayerSize) + upper]); 
     } 
    } 
} 

Ve gibi çeşitli basit fonksiyonları ile yerlerde onlarca çağrılan: işlev şöyle . Bu fonksiyon çağrılarını C# yapabilir mi? Yukarıdaki çağrılar böyle bir şey için satır içine yerleştirilmiş örneğin düşünüyorum:

buna onlarca Bence ekstra fonksiyon çağrıları binlerce anlamı yoksa
if (activationMethod == ActivationMethod.Binary) { 
    for (int lower = 0; lower < LowerLayerSize; lower++) { 
     for (int upper = 0; upper < UpperLayerSize; upper++) { 
      upperLayer.Values[upper] += weight; 
     } 
    } 
} else { 
    for (int lower = 0; lower < LowerLayerSize; lower++) { 
     for (int upper = 0; upper < UpperLayerSize; upper++) { 
      upperLayer.Values[upper] += lowerLayer.Values[lower] * weight); 
     } 
    } 
} 

büyük havai vardır. Bu% 10'luk bir hız artışı sağlarsa, buna kesinlikle değer. Çok fazla kodu yeniden yazmam gerektiğinden, karşılaştırma için el ile kolayca karşılaştırma yaparak kıyaslayamıyorum.

Bu yüzden sorum şu CAN C# bu çağrılarda mı? Ve eğer öyleyse, IN satırlı olduklarını nasıl öğrenebilirim?

+0

bu [cevap] Bkz (http://stackoverflow.com/a/8746128/1991068). –

+0

Bu işlevin satır içi çok fazla almaz. Sadece pratik olarak hiçbir şey yapmayan işlevler için ödeme yapar. –

+0

Delegeleri kullandığınız gerçeği onu oldukça olası kılar. – leppie

cevap

11

Satıriş, JIT derlemesinde gerçekleşir, bu nedenle satır içi çizgileri gözlemlemek için çalışma zamanında kodu incelemeniz gerekir. Bu, hata ayıklayıcısını kullanarak yapılabilir, ancak CLR, bir hata ayıklayıcının varlığını algılarsa, çeşitli en iyileştirmelerin devre dışı bırakıldığını, bu nedenle, yöntem derlendikten sonra hata ayıklayıcısını eklemeniz gerektiğini unutmayın.

WinDbg/SOS kullanarak yöntemi nasıl bulabileceğiniz hakkında bilgi için lütfen bkz theseanswers.