【问题标题】:AtomicLong vs Long performanceAtomicLong 与 Long 性能
【发布时间】:2012-10-16 08:57:25
【问题描述】:

上下文: 我正在使用 netty 并定义了一个处理程序来计算和分类传入/传出流量。为此,我使用了一个如下所示的 enumMap:

EnumMap<MyEnum, AtomicLong>

但是现在我意识到只有一个线程在操纵这些值(以前我认为它不止一个,netty 似乎保证每个通道一个线程)。这意味着 AtomicLong 不是必需的。 但是,由于 AtomicLong 是原始 long 的包装器,而 Long 是不可变类型,我有理由认为仅将 AtomicLong 交换为 Long 性能会降低。

对此有何想法?

我可能应该做的是移动到 int 并删除整个 enumMap 的东西..

BR 塞巴斯蒂安

【问题讨论】:

    标签: java performance atomic


    【解决方案1】:

    假设你只有一个线程:

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

    再次快速是使用long[] 或根本不使用对象与TObjectLongHashMap 之类的集合

    【讨论】:

    • 这就是我的意思。由于这些计数器会非常频繁地碰撞(每秒可能超过 10000 次),因此感觉真的没有必要创建新对象。
    • 如果您只是收集统计信息,您可能会考虑使用线程不安全版本,即使这意味着收集的值存在小错误。对于经常递增的计数器,这可能意味着大约 1% 的错误,但开销较低。 ;)
    【解决方案2】:

    我无法想象给定的:

    为了对传入/传出流量进行计数和分类

    AtomicLongLong(或long)的转换将对您的表现产生任何影响。

    【讨论】:

    • 完全同意。在性能成为问题之前不要担心(如果有的话)。如果是,请对其进行分析并做出明智的决定。
    • @sjr 我不太喜欢这种编码方式。当然,很多时候性能不是问题。但是,如果您至少在实现时考虑一下,您最终会得到更清晰的代码。而且如果你用正确的方式使用 cmets,可读性根本不会降低。
    • 参见 Effective Java(第 2 版),第 55 项。
    【解决方案3】:

    我们用 LongAdder 来做同样的事情;)

    【讨论】:

      猜你喜欢
      • 2017-07-20
      • 2020-11-14
      • 2016-03-15
      • 1970-01-01
      • 2014-04-24
      • 2011-05-08
      • 1970-01-01
      • 2016-04-18
      • 1970-01-01
      相关资源
      最近更新 更多