C# 线程安全的快速(最快)计数器
C# 线程安全的快速(最快)计数器
如何在C#中获得最佳性能的线程安全计数器?
这很简单:
public static long GetNextValue() { long result; lock (LOCK) { result = COUNTER++; } return result; }
但是否有更快的替代方案?
admin 更改状态以发布 2023年5月20日
正如别人所推荐的那样,使用Interlocked.Increment
会比使用lock()
具有更好的性能。只需查看IL和Assembly,您就会发现Increment
转变成了一个“总线锁定”语句,并且其变量直接递增(x86)或“添加”(x64)。
这个“总线锁定”语句锁定总线,以防止另一个CPU在调用CPU执行其操作时访问总线。现在,来看看C#lock()
语句的IL。您将在这里看到调用Monitor
以开始或结束一个部分。
换句话说,.Net的lock()
语句比Interlocked.Increment
做了更多的工作。
因此,如果您只想对变量进行递增,使用Interlock.Increment
会更快。查看所有的Interlocked
方法以查看可用的各种原子操作,并找到适合您需要的那些。当您想要执行更复杂的操作,例如多个相互关联的递增/递减,或者串行访问比整数更复杂的资源时,请使用lock()
。