重复的表达式:更好地制作变量?

时间:2014-01-18 01:09:23

标签: java performance variables

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

实施例。说 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);
}

3 个答案:

答案 0 :(得分:4)

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

JLS defines constant expressions in Section 15.28。基本上它由文字,运算符和常量变量组成。

通常,使用常量表达式而不是自己乘以值是更方便,可读和富有表现力。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

  

一般来说,创建变量并将其设置为等于X,或者根本不使用变量是否更有效?

一般来说,无法说可能更有效率。 可能没有区别。它可能可以想象甚至效率低下。这完全取决于JIT编译器对代码的作用,这取决于您使用的JVM,应用程序,甚至输入数据。

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

  

每种方法有哪些优点/缺点?

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

  • 可读性。将表达式拆分为具有临时变量的子表达式可能使您的代码更具可读性。 (这取决于代码复杂性......以及需要维护代码的人员的预期Java阅读技巧。)

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

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

  1. 对代码进行基准测试(正确!)以建立性能基准。
  2. 对其进行配置以识别热点。
  3. 修改代码以提高热点的性能。
  4. 重新运行基准测试,看看你是否有改进的东西。
  5. 转到第二步......
  6. (仅基于您的直觉进行优化,您可能会浪费大量时间进行优化,并且具有最小的可测量性能优势。另外请记住,针对一个平台进行优化并不一定能提高其他平台的性能......)