ho misurato il tempo di esecuzione di due modi per calcolare la potenza di 2:C#: Perché una chiamata di funzione è più veloce dell'inlining manuale?
1) linea
result = b * b;
2) Con una semplice funzione di chiamata
result = Power(b);
Quando si esegue in modalità Debug, tutto è come previsto: la chiamata di una funzione è notevolmente più costosa rispetto al calcolo in linea (385 ms in linea vs 570 ms chiamata di funzione).
In modalità di rilascio, mi aspetto che il compilatore acceleri notevolmente il tempo di esecuzione della chiamata di funzione poiché il compilatore inline internamente la piccolissima funzione Power()
. Ma NON mi aspetto che la chiamata alla funzione sia PIÙ VELOCE rispetto al calcolo manuale in linea.
Incredibilmente questo è il caso: nella versione di rilascio, la prima esecuzione richiede 109 ms e la seconda esecuzione con la chiamata a Power()
richiede solo 62 ms.
In che modo una chiamata di funzione può essere più veloce dell'inlining manuale?
Ecco il programma per la riproduzione:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Starting Test");
// 1. Calculating inline without function call
Stopwatch sw = Stopwatch.StartNew();
for (double d = 0; d < 100000000; d++)
{
double res = d * d;
}
sw.Stop();
Console.WriteLine("Checked: " + sw.ElapsedMilliseconds);
// 2. Calulating power with function call
Stopwatch sw2 = Stopwatch.StartNew();
for (int d = 0; d < 100000000; d++)
{
double res = Power(d);
}
sw2.Stop();
Console.WriteLine("Function: " + sw2.ElapsedMilliseconds);
Console.ReadKey();
}
static double Power(double d)
{
return d * d;
}
}
Hai avviato il programma sotto il debugger (F5)? In quel caso le ottimizzazioni sono state soppresse. – usr
Hai eseguito il file .exe generato o VS nella modalità di rilascio? Inoltre, hai provato a chiamarli in diversi ordini? Ho trovato che questo fa una sottile differenza – DGibbs
Bene, perché usare un int ** come doppio ** più veloce di un semplice doppio? – Vercas