我在
上写了两个程序Windows、视觉工作室 第 12 代英特尔(R) 酷睿(TM) i7-12700H,2300 Mhz,14 核,20 逻辑处理器
一个是 C#,另一个是 C++。 两者都只是使用 int i 和一个锁进行 for 循环,然后将全局 int 设置为循环计数器以使其执行一些操作。 我明白了...
C++: 26,315,789 locks per second (std::mutex)
C#: 58,823,529 locks per second ( C# lock(obj) { ... }
根据我的经验,锁定受到内存速度的限制,因此每个锁定的时间约为 20 ns。 因此每秒大约有 50,000,000 个。
为什么 C# 比 C++ 更快?
到目前为止我想到了...
好奇心想知道。
代码
C#
Object obj = new();
int N = 10000000;
Stopwatch sw2 = new Stopwatch();
Console.WriteLine($"Start {N} locks ");
sw2.Start();
for (int i = 0; i < N; i++)
{
lock (obj)
{
foo = N;
}
}
sw2.Stop();
int lps = (int)((double)N / ((double)sw2.ElapsedMilliseconds / 1000.0));
Console.WriteLine($"Done {N} locks in {sw2.ElapsedMilliseconds} ms {lps} locks per second.");
C++
std::cout << "Hello World!\n";
// Make a test timer
clock_t start, end;
start = clock();
int N = 10000000;
for (int i = 0; i < N; i++) {
mutex.lock();
foo++;
mutex.unlock();
}
end = clock();
printf("Time taken: %.2fs\n", (double)(end - start) / CLOCKS_PER_SEC);
printf("Locks per second: %.2f\n", N / ((double)(end - start) / CLOCKS_PER_SEC));
C# 在锁定方面可能优于 C++,因为它的
lock
机制可能更容易被 .NET 运行时优化。此外,C# JIT 编译器可能会更有效地优化同步,特别是在没有重大外部状态更改的情况下。