Tôi đã viết chương trình thử nghiệm nhỏ và đã rất ngạc nhiên tại sao giải pháp lock {}
hoạt động nhanh hơn khóa nhưng với thuộc tính [ThreadStatic]
trên biến tĩnh..NET: ThreadStatic và lock {}. Tại sao ThreadStaticAttribute làm giảm hiệu suất?
[ThreadStatic] đoạn:
[ThreadStatic]
private static long ms_Acc;
public static void RunTest()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
int one = 1;
for (int i = 0; i < 100 * 1000 * 1000; ++i) {
ms_Acc += one;
ms_Acc /= one;
}
stopwatch.Stop();
Console.WriteLine("Time taken: {0}", stopwatch.Elapsed.TotalSeconds);
}
khóa {} đoạn mã:
private static long ms_Acc;
private static object ms_Lock = new object();
public static void RunTest()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
int one = 1;
for (int i = 0; i < 100 * 1000 * 1000; ++i) {
lock (ms_Lock) {
ms_Acc += one;
ms_Acc /= one;
}
}
stopwatch.Stop();
Console.WriteLine("Time taken: {0}", stopwatch.Elapsed.TotalSeconds);
}
Trên máy tính của đoạn đầu tiên của tôi phải mất 4,2 giây; thứ hai - 3,2 giây, nhanh hơn 1 giây. Không có ThreadStatic và khóa - 1.2 giây.
Tôi tò mò tại sao thuộc tính [ThreadStatic]
trong ví dụ đơn giản này thêm quá nhiều thời gian thực thi chương trình?
CẬP NHẬT: Tôi cảm thấy rất tiếc, nhưng các kết quả này dành cho việc xây dựng DEBUG
. Đối với RELEASE
, tôi có các số hoàn toàn khác nhau: (1.2; 2.4; 1.2). Đối với số DEBUG
là (4.2; 3.2; 1.2).
Vì vậy, đối với RELEASE
, có vẻ như không có hình phạt nào về hiệu suất là [ThreadStatic]
.
Đó không phải là những gì tôi nhìn thấy trên quadcore của tôi. Nếu tôi biên dịch bản phát hành trên bất kỳ Cpu nào, tôi nhận được 0,81 giây cho đoạn đầu tiên và 4,5 giây cho đoạn mã thứ hai.Các trường hợp tầm thường mà không có an toàn thread mất 0,46s. – FuleSnabel
Bạn nói đúng. Tôi chuyển từ 'Debug' sang chế độ' Release' và nhận được kết quả tương tự. – Roman
Nó có thể giúp đọc mã tháo rời để hiểu tại sao bạn nhận được kết quả đáng ngạc nhiên. – FuleSnabel