LongAdder是一个精心设计的原子计数器,在更新共享计数器时应该减少缓存线争用。问题是,它依赖原子CAS操作来实际更新计数(这是它与更通用的LongAccumulator和朋友共享的特性)。
在amd64平台上(可能在其他地方),原子CAS比原子添加慢得多,至少当涉及到适量的核时是如此。因此,似乎简单地对单个共享VarHandle执行原子添加是一个更好的主意:代码更简单,而在普通(大约8核)容器上性能并不差甚至更好。
与LongAdder介导的原子添加相比,使用VarHandle是否有任何好处?
关于更多的上下文:
默认情况下,
LongAdder,是一个切分的CAS循环,那么JIT可以自由地升级到更好的东西,绝对比任何简单的CAS循环都要快,即使在低争用级别也是如此。然而,对于任何争用级别,发布于 2020-12-19 01:40:42
LongAdder的设计是为了在与AtomicLong相反的编写大量脚本的情况下更好地扩展,在任何级别的争用中都是如此,但没有,而且确实是这样。
如果您的场景不太注重编写,那么AtomicLong就会更快。
C2编译器总是用硬编码的程序集代替@HotSpotIntrinsicCandidate-annotated方法,而不仅仅是在它想这样做的时候。
lock xadd比CAS重试循环增加值的速度更快。LongAdder比lock xadd更快,因为它在线程之间拆分计数器。它会创建多个计数器,从而减少争用。
https://stackoverflow.com/questions/65353188
复制相似问题