web-dev-qa-db-ja.com

"B"の印刷が "#"の印刷よりも劇的に遅いのはなぜですか?

1000 x 1000の2つの行列を生成しました。

最初の行列:O#
2番目の行列:OB

次のコードを使用して、最初の行列が完了するまでに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 例えば試してみました、そして両方のコードは同じ速度で実行されます。

試験条件:

  • このテストは Netbeans 7.2 から実行し、その出力はコンソールに出力しました。
  • 測定にSystem.nanoTime()を使いました
2582
Kuba Spatny

純粋な憶測 は、文字の折り返しではなく Wordの折り返し を試行し、BをWordの文字として、#をWord以外の文字として扱うターミナルを使用しているということです。それで、それが行の終わりに達し、そしてその行を分割する場所を探すとき、それはほとんどすぐに#を見てそしてそこで幸せに分割します。一方、Bでは、検索する時間が長くなり、折り返すテキストが多くなる可能性があります(一部の端末ではバックスペースの出力、次に折り返される文字の上書きのためのスペースの出力など)。

しかし、それは純粋な憶測です。

3903
T.J. Crowder

私はEclipseとNetbeans 8.0.2の両方でJavaバージョン1.8のテストを実行しました。測定にはSystem.nanoTime()を使いました。

Eclipse:

私は 両方の場合で同じ時間を得ました - 前後 1.564秒

NetBeans:

  • "#"を使用: 1.536秒
  • "B"を使う: 44.164秒

そのため、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
.
.
.

等々..

概要:

  1. Eclipseは "B"と完璧に連携します。
  2. Netbeansには解決可能な行折り返し問題があります(この問題はEclipseでは発生しないため)(B( "B")の後にスペースを追加せずに)。
179
Roy Shmuli