Pertanyaan Mengapa mencetak "B" secara dramatis lebih lambat daripada mencetak "#"?


Saya menghasilkan dua matriks 1000 x 1000:

Matriks Pertama: O dan #.
Matriks Kedua: O dan B.

Dengan menggunakan kode berikut, matriks pertama membutuhkan waktu 8,52 detik untuk menyelesaikan:

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("");
 }

Dengan kode ini, matriks kedua membutuhkan 259.152 detik untuk menyelesaikan:

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("");
}

Apa alasan di balik waktu lari yang berbeda secara dramatis?


Seperti yang disarankan di komentar, hanya mencetak System.out.print("#"); dibutuhkan 7.8871 detik, sedangkan System.out.print("B"); memberi still printing....

Seperti orang lain yang menunjukkan bahwa itu bekerja untuk mereka secara normal, saya mencoba Ideone.com misalnya, dan kedua potongan kode dieksekusi pada kecepatan yang sama.

Ketentuan Uji:

  • Saya menjalankan tes ini dari Netbeans 7.2, dengan output ke konsolnya
  • Saya menggunakan System.nanoTime() untuk pengukuran

2414
2018-02-21 23:45


asal


Jawaban:


Spekulasi murni adalah Anda menggunakan terminal yang mencoba untuk melakukannya pembungkusan kata bukannya membungkus karakter, dan memperlakukan B sebagai karakter kata tapi # sebagai karakter bukan kata. Jadi ketika mencapai akhir baris dan mencari tempat untuk memutuskan garis, ia melihat a # segera dan dengan senang hati istirahat di sana; sedangkan dengan B, itu harus terus mencari lebih lama, dan mungkin memiliki lebih banyak teks untuk dibungkus (yang mungkin mahal pada beberapa terminal, misalnya, keluaran backspaces, kemudian keluaran ruang untuk menimpa huruf yang dibungkus).

Tapi itu spekulasi murni.


3720
2018-04-03 15:01



Saya melakukan tes pada Eclipse vs Netbeans 8.0.2, keduanya dengan Java versi 1.8; Saya menggunakan System.nanoTime() untuk pengukuran.

Gerhana:

Saya mendapat waktu yang sama pada kedua kasus - sekitar 1,564 detik.

Netbeans:

  • Menggunakan "#": 1,536 detik
  • Menggunakan "B": 44.164 detik

Jadi, sepertinya Netbeans memiliki kinerja buruk di cetak untuk menghibur.

Setelah penelitian lebih lanjut, saya menyadari bahwa masalahnya adalah pembungkus garis dari penyangga maksimal Netbeans (tidak terbatas pada System.out.println perintah), ditunjukkan oleh kode ini:

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("");
}

Hasil waktu kurang dari 1 milidetik setiap iterasi kecuali setiap iterasi kelima, ketika hasil waktunya sekitar 225 milidetik. Sesuatu seperti (dalam nanodetik):

BBB...31744
BBB...31744
BBB...31744
BBB...31744
BBB...226365807
BBB...31744
BBB...31744
BBB...31744
BBB...31744
BBB...226365807
.
.
.

Dan seterusnya..

Ringkasan:

  1. Eclipse berfungsi sempurna dengan "B"
  2. Netbeans memiliki masalah pembungkusan yang dapat dipecahkan (karena masalah tidak terjadi dalam gerhana) (tanpa menambah ruang setelah B ("B")).

148