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秒.
考虑一下,你会发现一个Increment
调用不能比增量运算符的简单应用更快.如果是,则编译器的增量运算符的实现将在Increment
内部调用,并且它们执行相同的操作.
但是,正如您可以通过自己测试一样,它们不会执行相同的操作.
这两个选项有不同的目的.一般使用增量运算符.Increment
当您需要操作是原子操作时使用,并且您确定该变量的所有其他用户也使用互锁操作.(如果他们不是全部合作,那么它并没有真正的帮助.)
它更慢。但是,这是我所知道的在标量变量上实现线程安全的最高效的通用方法。
归档时间: |
|
查看次数: |
13475 次 |
最近记录: |