Sto scrivendo un'applicazione performance-critical in C# e l'operazione di base è il calcolo del peso. La funzione è simile al seguente:C# compie queste funzioni?
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]);
}
}
}
E viene chiamato in decine di luoghi con diverse funzioni semplici come:
if (activationMethod == ActivationMethod.Binary) {
ForEachWeight((lower, upper, weight) => upperLayer.Values[upper] += weight;
} else {
ForEachWeight((lower, upper, weight) => upperLayer.Values[upper] += lowerLayer.Values[lower] * weight);
}
Tutte le chiamate vengono effettuate all'interno della stessa classe in modo tutte le variabili sono accessibili . Can C# inline queste chiamate di funzione? Sto pensando ad esempio le chiamate di cui sopra possono essere inline a qualcosa di simile:
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);
}
}
}
Se non lo fa vuol dire decine di migliaia di chiamate di funzione in più che a mio avviso sono una testa enorme. Se questo dà anche un aumento della velocità del 10% ne vale assolutamente la pena. Non riesco facilmente ad eseguire il benchmark manualmente inserendoli per il confronto poiché dovrei riscrivere un sacco di codice.
Quindi la mia domanda è CAN C# in linea queste chiamate? E se sì, come posso scoprire se sono stati in linea?
Vai a questa [risposta] (http://stackoverflow.com/a/8746128/1991068). –
Inlining di quella funzione non ti comprerà molto. Paga solo per le funzioni che praticamente non fanno nulla. –
Il fatto che si utilizzino i delegati lo rende altamente improbabile. – leppie