1000
x 1000
の2つの行列を生成しました。
最初の行列:O
と#
。
2番目の行列:O
とB
。
次のコードを使用して、最初の行列が完了するまでに8.52秒かかりました。
Random r = new Random();
for (int i = 0; i < 1000; i++) {
for (int j = 0; j < 1000; j++) {
if(r.nextInt(4) == 0) {
System.out.print("O");
} else {
System.out.print("#");
}
}
System.out.println("");
}
このコードでは、2番目の行列が完了するまでに259.152秒かかりました。
Random r = new Random();
for (int i = 0; i < 1000; i++) {
for (int j = 0; j < 1000; j++) {
if(r.nextInt(4) == 0) {
System.out.print("O");
} else {
System.out.print("B"); //only line changed
}
}
System.out.println("");
}
劇的に異なる実行時間の背後にある理由は何ですか?
コメントで示唆されているように、System.out.print("#");
だけを出力すると7.8871
秒かかるのに対して、System.out.print("B");
はstill printing...
を与える。
それが彼らのために普通に動くと指摘した他の人として、私は Ideone.com 例えば試してみました、そして両方のコードは同じ速度で実行されます。
試験条件:
System.nanoTime()
を使いました 純粋な憶測 は、文字の折り返しではなく Wordの折り返し を試行し、B
をWordの文字として、#
をWord以外の文字として扱うターミナルを使用しているということです。それで、それが行の終わりに達し、そしてその行を分割する場所を探すとき、それはほとんどすぐに#
を見てそしてそこで幸せに分割します。一方、B
では、検索する時間が長くなり、折り返すテキストが多くなる可能性があります(一部の端末ではバックスペースの出力、次に折り返される文字の上書きのためのスペースの出力など)。
しかし、それは純粋な憶測です。
私はEclipseとNetbeans 8.0.2の両方でJavaバージョン1.8のテストを実行しました。測定にはSystem.nanoTime()
を使いました。
私は 両方の場合で同じ時間を得ました - 前後 1.564秒 。
そのため、Netbeansはコンソールへの印刷でパフォーマンスが低下しているようです。
さらに調査した結果、問題はNetbeansの最大バッファの 行折り返し であることがわかりました(これはSystem.out.println
コマンドに限定されていません)。
for (int i = 0; i < 1000; i++) {
long t1 = System.nanoTime();
System.out.print("BBB......BBB"); \\<-contain 1000 "B"
long t2 = System.nanoTime();
System.out.println(t2-t1);
System.out.println("");
}
時間の結果が約225ミリ秒の場合、 5回の反復ごとの を除いて、時間の結果は反復ごとに1ミリ秒未満です。 (ナノ秒)のようなもの:
BBB...31744
BBB...31744
BBB...31744
BBB...31744
BBB...226365807
BBB...31744
BBB...31744
BBB...31744
BBB...31744
BBB...226365807
.
.
.
等々..