11

もちろん、これはJava(現在まで)では不可能なステートメントですが、理想的には、多くの反復の中心にあるので、実装したいと思います。たとえば、最初の複数回は、を作成しているときに650,000回以上実行していArrayListます。残念ながら、実際のコードにはループのset内側がありません。したがって、コマンドとコマンドelseの両方を通過し、時間を無駄にします。addset

その後、データがすでに作成されているため、セットを実行するだけの別のループにもあります。これは他の多くのループとマルチネストされているため、時間のかかるプロセスです。

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の速度がわかりません。

4

7 に答える 7

20

私は何かが足りないのですか?

この架空のコードではありません

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 test」がループ内で繰り返されないように、ループを書き直すことができることは明らかです...私が今行ったように。


FWIW、これはおそらく時期尚早の最適化のケースです。つまり、最適化する必要のないコードを最適化するために時間を無駄にしている可能性があります。

  • ご存知のとおり、JITコンパイラのオプティマイザはすでにコードを移動しているため、「else」部分はループに含まれていません。

  • そうでない場合でも、最適化しようとしている特定のことは、60万回実行されたとしても、重大なボトルネックではない可能性があります。

私のアドバイスは、今のところこの問題を忘れることです。プログラムを機能させます。動作しているときに、十分に高速に動作するかどうかを判断します。それがプロファイリングされない場合は、プロファイラー出力を使用して、最適化に時間を費やす価値がある場所を決定します。

于 2012-05-28T22:34:08.547 に答える
2

なぜしばらくカプセル化されているのかわかりません...

使用する

//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);
     }    
}
于 2012-05-28T22:32:00.033 に答える
1

「設定されていない場合は設定する」ことを意味するように「設定」ステートメントをラップし、while ループの上にそのまま配置します。

あなたは正しいです、言語はまさにその構文で探しているものを提供しませんが、それは私が提案したようなプログラミングパラダイムがあるためです。提案している構文は必要ありません。

于 2012-05-28T22:30:23.293 に答える
0

Java にはこの制御構造がありません。
ただし、他の言語もそうであることに注意してください。
たとえば、Python にはwhile-else構造があります。

Java の場合、既に示したように、この動作を模倣できます。

if (rowIndex >= dataColLinker.size()) {
    do {
        dataColLinker.add(value);
    } while(rowIndex >= dataColLinker.size());
} else {
    dataColLinker.set(rowIndex, value);
}
于 2016-06-27T02:35:28.020 に答える