【问题标题】:When to create a new variable to store a value rather than calling function multiple times?何时创建一个新变量来存储一个值而不是多次调用函数?
【发布时间】:2014-08-15 07:28:05
【问题描述】:

我曾经听说 PHP 和 Java 的区别在于 PHP 存储 foo() 的返回值比每次执行循环的条件语句时调用它更有效:

$x = 1;
for($y = 0; $y < foo($x); $y++)
{
  //code goes here
}

$x = 1;
$processed = foo($x);
for($y = 0; $y < $processed; $y++)
{
  //code goes here
}

在 Java 中,何时值得创建一个仅用于测试条件语句的变量(并且值永远不会改变)。例如,在我现在正在进行的一个项目中,有

int[] operator = new int[numberOfOperators(eqn)];
int[] numeric = new int[numberOfOperators(eqn) + 1];
for(int i = 0; i < operator.length; i++)
{
    //code goes here
}

Java 优化器或 JIT 编译器会知道如何处理这个问题,还是应该创建一个新变量来保存 numberOfOperators() 的返回值?

【问题讨论】:

  • 数组长度是一个属性,而不是一个函数。
  • @DaveNewton 没错。为什么你不这么认为?我想知道的一件事是从属性中获取值与从变量中获取值一样快?
  • 这取决于numberOfOperators 方法的实现。 JIT 可以内联方法并消除冗余代码。在某些情况下,JIT 可能会为您进行优化。
  • @Celeritas 我没有不这么认为。您正在比较两个完全不同的事物:方法调用和属性访问。至少我一开始是这么想的;但您问的是numberOfOperators,其返回值可能会在后续调用之间发生变化。
  • 当您尝试两种方式并测量速度差异时会发生什么?稍加努力,您就可以成为专家!

标签: java performance optimization jit


【解决方案1】:

不,它不会“缓存”或其他东西。编译器怎么会知道,如果在下一次调用 numberOfOperators() 时会有相同或不同的结果?

【讨论】:

  • 很多时候,确实如此。只需编写一个微基准测试,您就会发现大部分代码的执行频率并没有您预期的那么高(除非您真的知道自己在做什么)。
【解决方案2】:

JIT 可以内联和优化方法调用,但前提是它相对微不足道,例如字段查找。

在您尝试优化您的代码之前,您应该通过 CPU 和/或内存分析器运行它,当您测量了您的性能后,您可以决定如何优化您的代码。其他任何事情都只是猜测会产生什么影响。

简而言之,让代码清晰易懂,并在您知道自己有问题时担心性能,因为您测量了它。

【讨论】:

    猜你喜欢
    • 2016-05-13
    • 2011-10-26
    • 1970-01-01
    • 2017-03-06
    • 2015-08-02
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多