【问题标题】:Which one gives me better performance in variables declaration?哪一个在变量声明中给了我更好的性能?
【发布时间】:2017-01-10 07:41:25
【问题描述】:

我需要知道以下哪个示例可以提高我的性能?

Object O = someValue;
if (condition){
    //statements
    //statements
} else {
    //statements
    //statements
}

或者

Object O;
if (condition){
    O = someValue;
    //statements
    //statements
} else {
    O = someValue;
    //statements
    //statements
}

或者

if (condition){
    Object O = someValue;
    //statements
    //statements
} else {
    Object O = someValue;
    //statements
    //statements
}

注意:someValue 在所有情况下都是相等的

【问题讨论】:

  • 根据提供的代码,除非您使用的是 80 年代制造的计算机,否则我认为您不必担心此类微优化。
  • 你为什么不自己分析一下?
  • @CKing 不,这不是我要写的,这只是一个例子,我在一个繁重的算法中使用它,我需要知道其中哪一个能提供更高的性能
  • @RobbyCornelissen 你能告诉我如何分析它吗?
  • 运行和测量。完成。

标签: java variables variable-declaration variable-initialization


【解决方案1】:

编译器足够聪明,可以分析和确定初始化的最佳方式。但作为一种编码实践,第一个是首选,下面是第二个和第三个的缺点。

第二种方式只是增加了代码行数。如果您将来需要修改 someValue,您(或维护代码的人)需要在两个地方进行修改。如果 if 块足够长,我们可能会错过修改 else 块而导致错误情况。

第三种方法只是在条件块内初始化变量,并且只能在块内访问。据我了解,即使编译器也可能无法通过将初始化移出条件语句来优化初始化。这又遇到了第二种方法的问题。此外,在条件块中初始化的变量在外部无法访问,因此如果您需要在 if/else 块之外打印/记录对象,则不允许。

另一个事实:Java 编码约定不建议使用以大写字符开头的变量名。

【讨论】:

    【解决方案2】:

    第一个表示将是最佳的。也就是说,包括 JavaC 在内的大多数现代编译器都会优化字节码以减少或消除不必要的初始化。您可以使用 javap 或您最喜欢的字节码分析器等工具进行检查。

    这适用于大多数编译器,而不仅仅是 Java。

    【讨论】:

    • 这是否意味着编译器本身识别出初始化变量的最佳方式?
    • 清单 2 基本上为引用分配了相同的值。编译器认为这是多余的并内联该语句。清单 3 在本地范围内复制一个引用。除非在范围内使用 O,否则编译器只会将其消除。
    猜你喜欢
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 2021-10-14
    • 2010-12-25
    • 1970-01-01
    • 2019-08-05
    相关资源
    最近更新 更多