在不同的平台上,对于int和long,Interlocked.Increment(ref x)比x++快还是慢?
发布于 2009-06-23 17:53:44
它速度较慢,因为它强制动作自动发生,并且它充当内存屏障,消除了处理器对指令周围的内存访问进行重新排序的能力。
当你想让动作处于原子状态,并且可以在线程之间共享时,你应该使用Interlocked.Increment --它并不打算完全取代x++。
发布于 2009-08-19 18:06:35
根据我们的经验,InterlockedIncrement()等人在Windows上的影响是相当大的。在一个示例中,我们能够消除互锁,而使用++/--。仅此一项就将运行时间从140秒减少到110秒。我的分析是,互锁强制内存往返(否则其他内核如何看到它?)。L1缓存读/写大约是10个时钟周期,而内存读/写更像是100个时钟周期。
在此示例中,我估计递增/递减操作的数量约为10亿次。因此,在2 2Ghz的CPU上,++/--大约是5秒,互锁大约是50秒。将差异分散到多个线程,时间接近30秒。
发布于 2009-06-23 17:53:30
仔细考虑一下,您就会意识到Increment调用不可能比简单的增量运算符应用程序更快。如果是,那么编译器的增量操作符的实现将在内部调用Increment,并且它们将执行相同的操作。
但是,正如您通过自己测试可以看到的那样,它们的性能并不相同。
这两个选项有不同的用途。通常使用增量运算符。当您需要操作是原子的,并且您确定该变量的所有其他用户也在使用互锁操作时,请使用Increment。(如果他们不是所有人都合作,那么这并没有真正的帮助。)
https://stackoverflow.com/questions/1034070
复制相似问题