同时,其他环

xch*_*onx 10 java theory performance arraylist while-loop

当然这在java(迄今为止)中是一个不可能的陈述,但理想情况下我想实现它,因为它是许多迭代的核心.例如,第一次多次被称为我正在创建650,000次以上ArrayList.不幸的是,现实是我的实际代码没有循环set内部else; 因此就越过两者add,然后将set命令和浪费时间.

之后我还在另一个循环中,它只执行集合,因为数据已经创建,并且这是多嵌套的,因此它是一个漫长的过程.

ArrayList<Integer>  dataColLinker = new java.util.ArrayList<Integer>();
...
...
public void setLinkerAt( int value, int rowIndex) {
    ...
    while(rowIndex >= dataColLinker.size()) {
        dataColLinker.add(value);
    } else {
        dataColLinker.set(rowIndex, value);
    }
Run Code Online (Sandbox Code Playgroud)

任何想法或理论?在if语句和ArrayList命令等方面,我不确定java的速度

Ste*_*n C 20

我错过了什么吗?

这个假设的代码不是

while(rowIndex >= dataColLinker.size()) {
    dataColLinker.add(value);
} else {
    dataColLinker.set(rowIndex, value);
}
Run Code Online (Sandbox Code Playgroud)

意思是同样的事情?

while(rowIndex >= dataColLinker.size()) {
    dataColLinker.add(value);
}
dataColLinker.set(rowIndex, value);
Run Code Online (Sandbox Code Playgroud)

或这个?

if (rowIndex >= dataColLinker.size()) {
    do {
        dataColLinker.add(value);
    } while(rowIndex >= dataColLinker.size());
} else {
    dataColLinker.set(rowIndex, value);
}
Run Code Online (Sandbox Code Playgroud)

(后者更有意义......我猜).无论哪种方式,很明显你可以重写循环,以便在循环中不重复"else test"......就像我刚刚做的那样.


FWIW,这很可能是过早优化的情况.也就是说,您可能在浪费时间优化不需要优化的代码:

  • 众所周知,JIT编译器的优化器可能已经移动了代码,因此"else"部分不再处于循环中.

  • 即使它没有,也有可能你试图优化的特定事物不是一个重要的瓶颈......即使它可能被执行600,000次.

我的建议是暂时忘记这个问题.让程序正常运行.当它工作时,确定它是否运行得足够快.如果没有,则对其进行分析,并使用分析器输出来确定值得花时间优化的位置.

  • @Stephen我认为在像Python这样的语言中,else块仅在最初不满足while条件的情况下才执行。我知道这是Java,我们这里没有,但这可能是问题的根源。 (2认同)
  • @xchiltonx - 我不打算就此提出更多建议,因为我怀疑你是在浪费时间进行过早优化.看到我更新的答案. (2认同)