java 言語 「B」の印刷が「#」の印刷よりも大幅に遅いのはなぜですか?




java 移植 性 (2)

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

Eclipse:

私は両方のケースで同じ時間を過ごしました - 約1.564秒

ネットビーンズ:

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

だから、Netbeansはコンソールへの印刷でパフォーマンスが悪いようです。

さらに研究を重ねた結果、このコードで示されているNetbeansの最大バッファ( System.out.printlnコマンドに制限されていない)のline-wrappingが問題であることがわかりました:

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は、(B( "B")の後にスペースを追加せずに)問題がEclipseで発生しないため解決できる行折り返しの問題があります。

私は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("#");のみを印刷しSystem.out.print("#"); 7.8871秒かかるのに対して、 System.out.print("B"); still printing...

それが正常に動作することを指摘した他の人たちのように、私はIdeone.comを試してました。両方のコードが同じ速度で実行されています。

試験条件:

  • 私はNetbeans 7.2からこのテストを実行し、その出力をコンソールに送りました
  • 私はSystem.nanoTime()を使って測定しました

純粋な推測では、文字のword-wrappingではなくword-wrappingを試みる端末を使用していて、 Bを単語の文字として扱いますが、 #を非単語の文字として扱うことです。 だから、行の終わりに達し、行を壊す場所を検索すると、すぐに#見えて、そこに幸せに壊れます。 一方Bは長い間検索を続けなければならず、折り返すテキストが増えることがあります(バックスペースを出力し、ラップされている文字を上書きするスペースなど)。

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







system.out