我注意到啓動時間會因此而有所不同,因此我放置了一段初始化代碼。我覺得這很奇怪,所以我寫了一個小基準,證實了我的懷疑。看來在調用main方法之前執行的代碼比正常情況慢。靜態構造函數中的代碼運行速度較慢
爲什麼Benchmark();
以不同的速度運行,取決於在常規代碼路徑之前和之後調用?
這裏的基準代碼:
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;
}
}
結果表明:Benchmark()
運行幾乎兩倍兩個靜態構造函數和構造函數static Program program
財產慢:
// 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
倍增迭代的次數基準循環會使所有時間翻倍,這表明所發生的性能損失不是恆定的,而是一個因素。
// 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
爲什麼會這樣呢?這將是有意義的,如果初始化如果它完成它所屬的地方一樣快。測試是在.NET 4,發佈模式,優化。
究竟是什麼問題? – jcolebrand 2012-07-13 03:17:08
編譯設置?框架版本? – user7116 2012-07-13 03:24:41
請看看我的編輯是否讓你感覺(我不知道爲什麼),試着在.Net 4/release上得到類似的結果。 – 2012-07-13 03:52:17