AtomicLong和Long的性能比较

5

背景: 我在使用Netty并定义了一个处理程序以计算和分类进出流量。为此,我使用了一个枚举映射,它看起来像这样:

EnumMap<MyEnum, AtomicLong>

然而,我现在意识到只有一个线程在操作这些值(之前我以为不止一个线程,但Netty似乎保证每个通道只有一个线程)。这意味着AtomicLong是不必要的。但是,由于AtomicLong是原始长整型的包装器,而Long是不可变类型,所以我认为仅将AtomicLong换成Long将使性能更低。 你有任何想法吗? 我可能应该转换为int并删除整个enumMap的内容。
敬礼 Sebastian
3个回答

3

假设你只有一个线程:

如果可以避免对象创建,AtomicLong比使用Long更快。

使用long[]或者完全不使用对象,并使用像TObjectLongHashMap这样的集合,会更加快速。


这就是我的意思。由于这些计数器会被频繁地增加(每秒可以超过10,000次),因此创建新对象似乎非常不必要。 - Sebastian
如果你只是收集统计数据,即使这意味着收集到的值存在一些小误差,你可能会考虑使用线程不安全版本。对于经常增加的计数器来说,这可能意味着约1%的误差,但开销较低。 ;) - Peter Lawrey

2

我无法想象,如果给出以下内容:

为了计算和分类进出流量

AtomicLong 转换为 Long(或 long)对性能会有任何影响。


2
完全同意。在性能成为问题之前不要担心(如果它真的成为了问题)。如果出现问题,请进行分析并做出明智的决策。 - sjr
2
@sjr 我不太喜欢那种编码方式。当然,很多时候性能并不是问题。但是,如果你在实现时至少考虑一下它,最终会得到更清晰的代码。而且,如果你正确使用注释,可读性根本不会降低。 - brimborium
请查看《Effective Java(第2版)》,第55项。 - sjr

1
我们使用LongAdder来处理同样的问题 ;)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接