何时创建新变量来存储值而不是多次调用函数?

时间:2014-06-24 21:34:50

标签: java performance optimization jit

我曾经听说PHP和Java之间的区别在于PHP,以下更有效地存储foo()的返回值,而不是每次评估循环的条件语句时调用它:

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

VS

$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 Optimizer或JIT编译器是否知道如何处理此问题,还是应该创建一个保存numberOfOperators()返回值的新变量?

2 个答案:

答案 0 :(得分:2)

不,它不会缓存&#39;或者其他的东西。编译器怎么可能知道,如果在numberOfOperators()的下一次调用中,会有相同或不同的结果?

答案 1 :(得分:2)

JIT可以内联并优化方法调用,但前提是它相对简单,例如字段查找。

在尝试优化代码之前,应该通过CPU和/或内存分析器运行它,当您测量了性能时,就可以决定如何优化代码。其他任何东西都只是在猜测什么会有所作为。

简而言之,当您知道自己遇到问题并因为测量时,请使代码清晰易懂,并担心性能问题。