私は小さなテスト プログラムを作成しましたが、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 秒かかりました。秒 - 1 秒速い 3.2 秒。ThreadStatic とロックなし - 1.2 秒。
[ThreadStatic]
この単純な例の属性によって、プログラムの実行時間が大幅に増加するのはなぜでしょうか?
更新:大変申し訳ありませんが、これらの結果はDEBUG
ビルド用です。1つにはRELEASE
、まったく異なる数値 (1.2; 2.4; 1.2) が得られました。数値はDEBUG
(4.2; 3.2; 1.2)でした。
そのため、ビルドの場合、パフォーマンスの低下RELEASE
はないようです。[ThreadStatic]