2013-03-30 13 views
6

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?

+0

Vai a questa [risposta] (http://stackoverflow.com/a/8746128/1991068). –

+0

Inlining di quella funzione non ti comprerà molto. Paga solo per le funzioni che praticamente non fanno nulla. –

+0

Il fatto che si utilizzino i delegati lo rende altamente improbabile. – leppie

risposta

11

L'inlining avviene con la compilazione JIT, quindi è necessario controllare il codice in fase di esecuzione per osservare la linea. Questo può essere fatto usando il debugger, ma tieni presente che se il CLR rileva la presenza di un debugger vengono disabilitate varie ottimizzazioni, quindi è necessario collegare il debugger dopo che il metodo è stato compilato.

Vedere theseanswers per alcune informazioni su come è possibile trovare il metodo utilizzando WinDbg/SOS.