-6

どちらがパフォーマンスに優れているか、このループ:

for (int i = 0; i < 100; i++) { 
    for (int j = 0; j < 10; j++) { }
}

またはこのループ:

for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 100; j++) { }
}

なぜ?

4

7 に答える 7

3

内側のループが実際に何かを行うと仮定しましょう。FredrikRedin と niculare はもちろん正しいです。内部ループの実行回数は同じです。この場合、2 番目の例は内側のループを 10 回セットアップする必要があるのに対し、最初の例は内側のループを 100 回セットアップする必要があるため、2 番目の例が (わずかに) 優先されます。セットアップされたループの総数:

  • 最初の例: 101
  • 2 番目の例: 11

ループの設定には時間がかかるため、2 番目の例が優先されます。他のすべての条件は同じです (決して同じではありません)。一般に、内側のループと外側のループの間で反復を分割できる場合は、内側のループにより多くの反復を与えて、外側のループの反復回数を減らします。

于 2013-03-09T21:37:06.397 に答える
0

経験的証拠は、それらがほぼ同じであることを示しています。

(ループ内の最小限の操作でのミリ秒単位の時間)

最初の1003、2番目の1113
最初の1012、2番目の1001
最初の1000、2番目の1002
最初の1001、2番目の1006
最初の1013、2番目の1001
最初の1001、2番目の1001
最初の1007、2番目の1027
最初の1018、2番目の1001
最初の1001、2番目の1002
最初の1001、2番目の1001
最初の1001、2番目の1001
最初の1002、2番目の1000

理論的には、私はangelatlargeの答えを使用します。私はそれがループの中にあるものに依存すると信じています:あなたが新しいオブジェクトなどを構築しているなら、何百回も何十回よりも遅くなります。

于 2013-03-09T22:51:08.317 に答える
0

'*'は可換であるため、実際には同じ回数の反復を実行します。前者の場合、反復回数はになりますが、後者の100*10場合はになります10*100。したがって、両方とも1000回の反復に再開します。

于 2013-03-09T21:33:44.017 に答える
0

その同じ数の操作。反復や2つのforループ(中断/続行)のいずれかをスキップするロジックがない限り、なぜパフォーマンスの違いを期待するのですか?

于 2013-03-09T21:34:12.410 に答える
0

javac コンパイラ (Java コードをバイトコードにコンパイルする) と JIT (バイトコードをアセンブリにコンパイルする) の両方で、両方のループをノーオペレーションとして扱うことができます (ループ本体に何もないため)。

実際には、javac がそれを行う可能性は低いですが、JIT がそのコードをスキップする可能性は非常に高いです。

結論: Java コードのパフォーマンスはコンテキストに大きく依存し、何もしないループに関する特定の質問については、答えは次のとおりです。どちらもスキップされ、すぐに実行されます。

于 2013-03-10T01:23:19.823 に答える
0

それらは同じですが、最初の反復子に 100 のサブ反復子が含まれており、次の反復子の変更は 10 ステップであり、100 ステップよりも優れているため、原子時間では 10*100 の方が優れています。最良の結果を得るにはAtomic Integer、 またはbyteを使用できますintint32 ビットとbyte8 ビットです。

于 2013-03-09T21:55:50.007 に答える
0

同じ性能とは思えません。その理由は分岐予測です。

于 2013-03-09T21:50:35.060 に答える