C# 中的锁定速度比 C++ 更快?

问题描述 投票:0回答:1

我在

上写了两个程序

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++ 更快?

到目前为止我想到了...

  • 编译器优化了全局集并在循环之后执行了它?
  • std::mutex 并不是那么好。
  • C# 中的自动并行?是 12 个线程吗,因此每个线程锁定就像每秒 2,000,000 次?
  • 某种片上最佳锁定硬件? (没有往返内存?)

好奇心想知道。

代码

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++ multithreading locking
1个回答
0
投票

C# 在锁定方面可能优于 C++,因为它的

lock
机制可能更容易被 .NET 运行时优化。此外,C# JIT 编译器可能会更有效地优化同步,特别是在没有重大外部状态更改的情况下。

© www.soinside.com 2019 - 2024. All rights reserved.