重复的表达式:是否生成一个变量更好



在Java中,假设我有一个在函数中多次出现的表达式X。一般来说,创建一个变量并将其设置为X更有效,还是根本不使用变量?每种方法的优点/缺点是什么?

Ex。说X=5+9*9-1000。哪个函数更有效,函数1还是函数2?

public void function1() {
System.out.println(5+9*9-1000);
System.out.println(5+9*9-1000);
}
public void function2() {
int variable = 5+9*9-1000;
System.out.println(variable);
System.out.println(variable);
}

两者的效率都不高。表达式5+9*9-1000常量表达式。编译器将在编译时对其进行评估,并且只有结果在运行时显示(-914)。

JLS在第15.28节中定义了常量表达式。基本上它由文字、运算符和常量变量组成。

通常,使用常量表达式比自己乘以值更方便、可读和表达。

int secondsPerDayCalc = 86400;     // not obvious it's number of seconds in a day
int secondsPerDay = 60 * 60 * 24;  // constant expression; more readable

没有性能损失,因为它是在编译时评估的。

在这种情况下使用变量,在更复杂的情况下使用函数。是的,可能会提高效率,但真正的问题是代码的可维护性。如果表达式需要更改,像这样重复的字符串会产生潜在的错误。

一般来说,创建一个变量并将其设置为X更高效,还是根本不使用变量?

一般来说,说是不可能的。它可能更有效。它可能没有什么区别。可以想象,它甚至效率更低。这一切都取决于JIT编译器对代码的处理,也取决于您正在使用的JVM、应用程序,甚至输入数据。

(在您的具体示例中,表达式是常量表达式,它们将在编译时进行评估。这使得运行时效率问题变得毫无意义。)

每种方法的优点/缺点是什么?

在我看来,最重要的问题是:

  • 可读性。将一个表达式拆分为带有临时变量的子表达式可以提高代码的可读性。(这取决于代码的复杂性…以及需要维护代码的人员所期望的Java阅读技能。)

  • 副作用。有些表达涉及副作用。在这种情况下,使用临时变量的重构可能会更改计算的含义。

最好的一般建议是将这种优化留给JIT编译器。但是,如果性能是一个关键的问题,并且您确实需要在这个级别上进行优化,那么您需要科学地进行优化。

  1. 对代码进行基准测试(正确!)以建立性能基线
  2. 对其进行分析以识别热点
  3. 修改代码以提高热点的性能
  4. 重新运行基准测试,看看你是否有所改进
  5. 转到第二步

最新更新