同时,其他环

时间:2012-05-28 22:26:33

标签: java performance arraylist while-loop theory

当然这在java(迄今为止)中是一个不可能的陈述,但理想情况下我想实现它,因为它是许多迭代的核心。例如,第一次多次被称为我在创建ArrayList时做了650,000次。 不幸的是,现实是我的实际代码在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);
    }

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

7 个答案:

答案 0 :(得分:18)

我错过了什么吗?

这个假设代码不是

while(rowIndex >= dataColLinker.size()) {
    dataColLinker.add(value);
} else {
    dataColLinker.set(rowIndex, value);
}

与此意思相同?

while(rowIndex >= dataColLinker.size()) {
    dataColLinker.add(value);
}
dataColLinker.set(rowIndex, value);

还是这个?

if (rowIndex >= dataColLinker.size()) {
    do {
        dataColLinker.add(value);
    } while(rowIndex >= dataColLinker.size());
} else {
    dataColLinker.set(rowIndex, value);
}

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


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

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

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

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

答案 1 :(得分:3)

我不明白为什么会有一段时间的封装...

使用

//Use the appropriate start and end...
for(int rowIndex = 0, e = 65536; i < e; ++i){        
    if(rowIndex >= dataColLinker.size()) {
         dataColLinker.add(value);
     } else {
        dataColLinker.set(rowIndex, value);
     }    
}

答案 2 :(得分:1)

将“set”语句换成“set if not set”,并将其置于while循环上方。

你是对的,语言并没有提供你正在寻找的语法,但那是因为有一些我刚才建议的编程范例所以你不需要你提出的语法。

答案 3 :(得分:0)

Java没有这种控制结构 但应该注意的是,其他语言也是如此 例如,Python具有while-else构造。

在Java的情况下,您可以像您已经显示的那样模仿这种行为:

if (rowIndex >= dataColLinker.size()) {
    do {
        dataColLinker.add(value);
    } while(rowIndex >= dataColLinker.size());
} else {
    dataColLinker.set(rowIndex, value);
}

答案 4 :(得分:0)

boolean entered = false, last;
while ( (entered |= last = ( condition )) && last ) {
        // Do while
} if ( !entered ) {
        // Else
}

欢迎你。

示例:

boolean entered = false, last;
while ( (entered |= last = (atomic.get() > 3 && !status.destroyed()) && so on) && last ) {
        // Do while
} if ( !entered ) {
        // Else
}

答案 5 :(得分:0)

这个while语句只应在条件为false时执行else代码,这意味着它将始终执行它。但是,有一个问题,当你在while循环中使用break关键字时,else语句不应该执行。

满足条件的代码只是:

boolean entered = false;
while (condition) {
   entered = true; // Set it to true stright away
   // While loop code


   // If you want to break out of this loop
   if (condition) {
      entered = false;
      break;
   }
} if (!entered) {
   // else code
}

答案 6 :(得分:0)

假设您来自Python并接受同样的事情:

def setLinkerAt(value, rowIndex):
    isEnough = lambda i: return i < dataColLinker.count()
    while (not isEnough(rowIndex)):
        dataColLinker.append(value)
    else:
        dataColLinker[rowIndex] = value 

我能想到的最相似的是:

public void setLinkerAt( int value, int rowIndex) {
    isEnough = (i) -> { return i < dataColLine.size; }
    if(isEnough()){
        dataColLinker.set(rowIndex, value);
    }
    else while(!isEnough(rowInex)) {
        dataColLinker.add(value);
    }

注意需要逻辑和反向逻辑。我不确定这是一个很好的解决方案(重复逻辑),但无括号else是我能想到的最接近的语法,同时保持不执行逻辑超过要求的相同行为。