我编写了小型测试程序,并且很惊讶为什么lock {}
解决方案的执行速度比无锁更快,但[ThreadStatic]
属性优于静态变量。
[ThreadStatic] 片段:
[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);
}
锁定 {} 片段:
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);
}
在我的机器上,第一个片段需要 4.2 秒;秒 - 3.2 秒,快 1 秒。没有 ThreadStatic 和锁定 - 1.2 秒。
我很好奇为什么[ThreadStatic]
这个简单示例中的属性会增加程序执行时间?
更新:我感到非常抱歉,但这些结果是用于DEBUG
构建的。一方面RELEASE
,我得到了完全不同的数字:(1.2;2.4;1.2)。数字为DEBUG
(4.2; 3.2; 1.2)。
因此,对于RELEASE
构建似乎没有[ThreadStatic]
性能损失。