Tôi nhận thấy rằng thời gian khởi động sẽ khác nhau tùy thuộc vào tại đây tôi đã đặt một đoạn mã khởi tạo. Tôi nghĩ điều này thật kỳ lạ, vì vậy tôi đã viết một điểm chuẩn nhỏ, điều này đã khẳng định những nghi ngờ của tôi. Có vẻ như mã được thực thi trước khi phương thức main được gọi chậm hơn bình thường.Mã trong hàm dựng tĩnh chạy chậm hơn
Tại sao Benchmark();
chạy ở các tốc độ khác nhau tùy thuộc vào việc được gọi trước và sau đường dẫn mã thông thường?
Đây là mã chuẩn:
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;
}
}
Kết quả cho thấy Benchmark()
chạy gần gấp đôi chậm cho cả các nhà xây dựng tĩnh và constructor cho static Program program
tài sản:
// 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
Tăng gấp đôi số lần lặp trong vòng lặp chuẩn gây ra tất cả các lần tăng gấp đôi, cho thấy rằng hình phạt hiệu suất phát sinh không phải là hằng số, mà là một yếu tố.
// 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
Tại sao điều này xảy ra? Nó sẽ có ý nghĩa nếu khởi tạo sẽ chỉ là nhanh nếu nó được thực hiện nơi nó thuộc về. Thử nghiệm đã được thực hiện trong .NET 4, chế độ phát hành, tối ưu hóa trên.
Câu hỏi chính xác là gì? – jcolebrand
Cài đặt biên dịch? Phiên bản khung? – user7116
Xin vui lòng xem nếu chỉnh sửa của tôi làm cho sence (Tôi không có ý tưởng tại sao), đã thử rằng trên .Net 4/phát hành với kết quả tương tự. –