Interlocked.Increment的性能

SLa*_*aks 22 .net performance interlocked interlocked-increment

Interlocked.Increment(ref x)不是更快或更慢x++的在各种平台上整数和长?

Mic*_*ael 40

它较慢,因为它强制动作以原子方式发生,并且它充当内存屏障,消除了处理器重新排序指令周围的内存访问的能力.

当您希望操作在线程之间可以共享的状态时,您应该使用Interlocked.Increment - 它并不打算完全替换x ++.


小智 16

根据我们的经验,Windows上的InterlockedIncrement()等是非常重要的影响.在一个示例中,我们能够消除互锁并使用++/ - 代替.仅此一项就将运行时间从140秒减少到110秒.我的分析是,互锁会强制进行内存往返(否则其他内核怎么能看到它?).L1高速缓存读/写大约是10个时钟周期,但内存读/写更像是100.

在此示例中,我估计增量/减量操作的数量约为10亿.因此在2Ghz CPU上,这对于++/ - 来说是5秒,对于互锁则是50秒.跨越多个线程传播差异,接近30秒.

  • Micrsoft说:InterlockedIncrement在http://msdn.microsoft.com/en-us/library/windows/desktop/ee418650(v=vs.85).aspx中被测量为36-90个周期. (6认同)
  • 36声音适合无争议的操作,我在Core i7上进行了大量竞争操作的约120次,但也许我拙劣了?无论如何,"互锁强制内存往返(否则其他内核怎么看?).一个L1缓存读/写大约是10个时钟周期......" - 它足以将该页面标记为已更改且仅从L1刷新到内存如果另一个核心需要看到它,那么无争议的操作可以更接近频谱的10端(在36)而不是100 + .... (2认同)

Rob*_*edy 6

考虑一下,你会发现一个Increment调用不能比增量运算符的简单应用更快.如果是,则编译器的增量运算符的实现将在Increment内部调用,并且它们执行相同的操作.

但是,正如您可以通过自己测试一样,它们不会执行相同的操作.

这两个选项有不同的目的.一般使用增量运算符.Increment当您需要操作是原子操作时使用,并且您确定该变量的所有其他用户也使用互锁操作.(如果他们不是全部合作,那么它并没有真正的帮助.)

  • 编译器当然可以通过Increment实现++.它不会通过简单的"调用"指令实现,但可以使用编译器引入的临时指令来完成.关键是编译器使用加速可用的递增数字的方法; 如果有更快的东西,编译器会使用它代替. (3认同)

Dre*_*ins 5

它更慢。但是,这是我所知道的在标量变量上实现线程安全的最高效的通用方法。

  • 小心挥发;某些处理器架构 (x86/x64) 能够重新排序对内存的访问,无论该内存是否被编译器标记为易失性。 (2认同)