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?
Zobacz ten [Odpowiedź] (http://stackoverflow.com/a/8746128/1991068). –
Podpowiedź tej funkcji niewiele Ci nie kupi. Opłaca się tylko za funkcje, które praktycznie nic nie robią. –
Fakt, że korzystasz z delegatów, sprawia, że jest to mało prawdopodobne. – leppie