2013-03-30 20 views
6

Piszę aplikację krytyczną wydajność w języku C# i podstawową operacją jest obliczanie wagi. Funkcja wygląda tak:Czy C# wbuduje te funkcje?

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]); 
     } 
    } 
} 

i robi się nazywa w kilkudziesięciu miejscach o różnych prostych funkcji takich jak:

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

Wszystkie połączenia są wykonane z tej samej klasy więc wszystkie zmienne są dostępne . Czy C# może wbudować te wywołania funkcji? Zastanawiam się na przykład powyższe połączenia mogą być wstawiane do czegoś takiego:

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); 
     } 
    } 
} 

Jeśli to nie znaczy, że dziesiątki tysięcy dodatkowych wywołań funkcji, które myślę, że są ogromne napowietrznych. Jeśli daje to nawet 10% zwiększenie prędkości, to jest tego warte. Nie mogę łatwo porównywać wyników ręcznie, ustawiając je dla porównania, ponieważ musiałbym przepisać dużo kodu.

Moje pytanie brzmi: CAN C# inline te połączenia? A jeśli tak, to jak mogę się dowiedzieć, JEŚLI zostały zainicjowane?

+0

Zobacz ten [Odpowiedź] (http://stackoverflow.com/a/8746128/1991068). –

+0

Podpowiedź tej funkcji niewiele Ci nie kupi. Opłaca się tylko za funkcje, które praktycznie nic nie robią. –

+0

Fakt, że korzystasz z delegatów, sprawia, że ​​jest to mało prawdopodobne. – leppie

Odpowiedz

11

Inlining dzieje się podczas kompilacji JIT, więc należy sprawdzić kod w czasie wykonywania, aby obserwować inline. Można to zrobić za pomocą debuggera, ale należy pamiętać, że jeśli CLR wykryje obecność debuggera, różne optymalizacje są wyłączone, więc musisz załączyć debuggera po skompilowaniu metody.

Proszę zobaczyć theseanswers, aby uzyskać informacje o tym, w jaki sposób można znaleźć metodę przy użyciu WinDbg/SOS.