C# lock和Interlocked性能测试
测试代码
public class LockTest
{
private static object lockObj = new object();
private static int Count = 0;
public static void Test()
{
int threadCount = 10;
for (int k = 0; k < 10; k++)
{
Count = 0;
var watch = new Stopwatch();
watch.Start();
var tasks = new List<Task>();
for (int i = 0; i < threadCount; i++)
{
var task = Task.Factory.StartNew(
() =>
{
for (int j = 0; j < 10000000; j++)
{
OnlyLockTest();
}
});
tasks.Add(task);
}
Task.WaitAll(tasks.ToArray());
watch.Stop();
Console.WriteLine(k + 1 + " 线程数:" + threadCount + ", Lock耗时:" + watch.ElapsedTicks + ",计算结果: " + Count);
Count = 0;
watch = new Stopwatch();
watch.Start();
var tasks1 = new List<Task>();
for (int i = 0; i < threadCount; i++)
{
var task = Task.Factory.StartNew(
() =>
{
for (int j = 0; j < 10000000; j++)
{
InterlockedTest();
}
});
tasks1.Add(task);
}
Task.WaitAll(tasks1.ToArray());
watch.Stop();
Console.WriteLine(k + 1 + " 线程数:" + threadCount + ", Interlocked耗时:" + watch.ElapsedTicks + ",计算结果: " + Count);
}
}
private static void OnlyLockTest()
{
lock (lockObj)
{
Count++;
}
}
private static void InterlockedTest()
{
Interlocked.Increment(ref Count);
}
}
测试结果
测试机器:4核cpu,16G内存,win7
设置线程数为2,执行10000000次,跑10遍
设置线程数为4,每个线程计算10000000次,跑10遍,cpu占用100%
设置线程数为10,每个线程计算10000000次,跑10遍,cpu占用100%
在cpu达到100%的时候,这个压力测试已经没啥意义了,在cpu可用范围内,Interlocked性能还是更优越一点的。