C# 线程安全的快速(最快)计数器

22 浏览
0 Comments

C# 线程安全的快速(最快)计数器

如何在C#中获得最佳性能的线程安全计数器?

这很简单:

public static long GetNextValue()
{
    long result;
    lock (LOCK)
    {
        result = COUNTER++;
    }
    return result;
}

但是否有更快的替代方案?

admin 更改状态以发布 2023年5月20日
0
0 Comments

正如别人所推荐的那样,使用Interlocked.Increment会比使用lock()具有更好的性能。只需查看IL和Assembly,您就会发现Increment转变成了一个“总线锁定”语句,并且其变量直接递增(x86)或“添加”(x64)。

这个“总线锁定”语句锁定总线,以防止另一个CPU在调用CPU执行其操作时访问总线。现在,来看看C#lock()语句的IL。您将在这里看到调用Monitor以开始或结束一个部分。

换句话说,.Net的lock()语句比Interlocked.Increment做了更多的工作。

因此,如果您只想对变量进行递增,使用Interlock.Increment会更快。查看所有的Interlocked方法以查看可用的各种原子操作,并找到适合您需要的那些。当您想要执行更复杂的操作,例如多个相互关联的递增/递减,或者串行访问比整数更复杂的资源时,请使用lock()

0
0 Comments

这将会更简单:

return Interlocked.Increment(ref COUNTER);

MSDN Interlocked.Increment

0