【问题标题】:Is there any performance gain from using final modifier on non-primitive static data?在非原始静态数据上使用 final 修饰符是否有任何性能提升?
【发布时间】:2013-05-09 00:22:31
【问题描述】:

在 Java 中对非原始静态数据使用 final 修饰符是否有任何性能提升?

例如:

static final Thread t2 = new Thread(new Thread_2());

对比:

static Thread t2 = new Thread(new Thread_2());

我的意思是,原语的静态 final 定义了一个真正的常量,并且可以很好地使用,因为它的值在编译时是已知的,但是在这种非原始情况下使用 final 会触发任何优化吗?

在这种情况下使用 final 有什么作用还是浪费?

请不要在风格方面/良好实践方面提供答案,但仅限于性能方面。

【问题讨论】:

  • final 与“性能”无关。它们也不是“在编译时就知道的”。
  • @Brian Roach 你是什么意思?静态最终原语的值在编译时是已知的。例如: static final int me = 10;
  • 在您的声明中错过了static 部分,但这并没有真正改变任何事情。

标签: java performance final primitive compiler-theory


【解决方案1】:

如果 JVM 知道一个值永远不会改变(例如,禁用空检查),它可以进行一些优化,因此它会带来一些小的性能提升。但是,几乎在所有情况下,这种收益都太小而无法注意到或担心。我对您的程序了解不多,但我猜想将时间花在制作变量 final 上会更好地用于开发更有效的算法。

【讨论】:

  • 我正在制作一个骨架,上面将放置其他代码。我只是想确保这个骨架在性能方面得到尽可能多的优化。不过,这只是一个理论问题。将 final 放入每个不变的变量中并不是那么耗时。虽然我是干净代码的崇拜者,我想避免使用额外的关键字,如果可能的话,什么都不做,但同时我不能忍受如果我使用它会更快(甚至稍微)的可能性 ' em ;-)
  • @PetrosDrakoulis 我也是一个完美主义者,但我有时必须学会克服它并着眼于大局。不过,如果它们真的永远不会改变,最好还是标记它们final
  • 一些比我更了解 Java 的人告诉我,今天的编译器可以确定一个字段什么时候不会被更改,至少如果它不是公开的或也许受到保护。因此,如果编译器已经这样做了,您可能根本不会在优化方面获得太多收益。如果出于需要我有一个全局对象,我可能会将它标记为 final。
  • @AndrewLazarus 是的,我也听说过同样的事情。但是最常见的 JIT(我认为是热点)呢?
【解决方案2】:

虽然性能提升可能会很小,并且一些 static final 值将嵌入到使用它们的类中,但在我看来,最大的好处是编译器强制执行该值的意图和设计改变——也就是说,收益是给开发者的。

在我看来,骨架/框架代码在各个方面都应该是最好的,不仅是性能,而且在风格上也是如此。

我鼓励您将所有内容声明为 final ,除非它确实需要可变 - 也就是说,默认情况下事物是 final 的,除非需要另外设置。

【讨论】:

    猜你喜欢
    • 2013-11-22
    • 2014-11-30
    • 2010-09-20
    • 2011-10-19
    • 2011-11-11
    • 2012-08-25
    • 1970-01-01
    • 2016-05-15
    • 2011-03-11
    相关资源
    最近更新 更多