Ho notato che i tempi di avvio variano a seconda di qui che ho inserito un pezzo di codice di inizializzazione. Ho pensato che fosse davvero strano, così ho scritto un piccolo benchmark, che ha confermato i miei sospetti. Sembra che il codice che viene eseguito prima che venga invocato il metodo principale è più lento del normale.Il codice nel costruttore statico funziona più lentamente
Perché lo Benchmark();
funziona a velocità diverse a seconda che venga chiamato prima e dopo il percorso regolare del codice?
Ecco il codice di riferimento:
class Program {
static Stopwatch stopwatch = new Stopwatch();
static Program program = new Program();
static void Main() {
Console.WriteLine("main method:");
Benchmark();
Console.WriteLine();
new Program();
}
static Program() {
Console.WriteLine("static constructor:");
Benchmark();
Console.WriteLine();
}
public Program() {
Console.WriteLine("public constructor:");
Benchmark();
Console.WriteLine();
}
static void Benchmark() {
for (int t = 0; t < 5; t++) {
stopwatch.Reset();
stopwatch.Start();
for (int i = 0; i < 1000000; i++)
IsPrime(2 * i + 1);
stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds + " ms");
}
}
static Boolean IsPrime(int x) {
if ((x & 1) == 0)
return x == 2;
if (x < 2)
return false;
for (int i = 3, s = (int)Math.Sqrt(x); i <= s; i += 2)
if (x % i == 0)
return false;
return true;
}
}
I risultati mostrano che Benchmark()
corre quasi il doppio più lento sia per il costruttore statico e di costruzione per la static Program program
immobile:
// static Program program = new Program()
public constructor:
894 ms
895 ms
887 ms
884 ms
883 ms
static constructor:
880 ms
872 ms
876 ms
876 ms
872 ms
main method:
426 ms
428 ms
426 ms
426 ms
426 ms
// new Program() in Main()
public constructor:
426 ms
427 ms
426 ms
426 ms
426 ms
Raddoppiare il numero di iterazioni in il ciclo di riferimento fa raddoppiare tutte le volte, suggerendo che la penalizzazione delle prestazioni sostenuta non è costante, ma un fattore.
// static Program program = new Program()
public constructor:
2039 ms
2024 ms
2020 ms
2019 ms
2013 ms
static constructor:
2019 ms
2028 ms
2019 ms
2021 ms
2020 ms
main method:
1120 ms
1120 ms
1119 ms
1120 ms
1120 ms
// new Program() in Main()
public constructor:
1120 ms
1128 ms
1124 ms
1120 ms
1122 ms
Perché dovrebbe essere così? Avrebbe senso se l'inizializzazione sarebbe altrettanto veloce se fosse eseguita dove appartiene. Il test è stato eseguito in .NET 4, modalità di rilascio, ottimizzazioni in.
Qual è la domanda esattamente? – jcolebrand
Impostazioni di compilazione? Versione del framework? – user7116
Controlla se le mie modifiche sono corrette (non ho idea del perché), l'ho provato su .Net 4/release con risultati simili. –