Saya menghasilkan dua matriks 1000
x 1000
:
Matriks Pertama: O
dan #
.
Matriks Kedua: O
dan B
.
Menggunakan kode berikut, matriks pertama membutuhkan 8,52 detik untuk selesai:
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 run time yang sangat berbeda?
Seperti yang disarankan dalam komentar, pencetakan hanya System.out.print("#");
membutuhkan beberapa 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.
Kondisi pengujian:
- Saya menjalankan tes ini dari Netbeans 7.2 , dengan output ke konsolnya
- Saya digunakan
System.nanoTime()
untuk pengukuran
java
performance
loops
for-loop
system.out
Kuba Spatny
sumber
sumber
Jawaban:
Spekulasi murni adalah bahwa Anda menggunakan terminal yang mencoba melakukan pembungkus kata daripada pembungkus karakter, dan memperlakukan
B
sebagai karakter kata tetapi#
sebagai karakter non-kata. Jadi ketika mencapai ujung garis dan mencari tempat untuk memecahkan garis, ia melihat#
hampir segera dan dengan senang hati istirahat di sana; sedangkan denganB
itu, ia harus terus mencari lebih lama, dan mungkin memiliki lebih banyak teks untuk dibungkus (yang mungkin mahal pada beberapa terminal, misalnya, menghasilkan backspaces, kemudian mengeluarkan spasi untuk menimpa huruf yang sedang dibungkus).Tapi itu spekulasi murni.
sumber
B
menyelesaikannya.System.out.println
tidak melakukan wordwrapping; hal yang dikeluarkannya adalah melakukan pembungkusan kata (dan memblokir, jadiSystem.out.println
harus menunggu).Saya melakukan tes pada Eclipse vs Netbeans 8.0.2, keduanya dengan Java versi 1.8; Saya digunakan
System.nanoTime()
untuk pengukuran.Gerhana:
Saya mendapatkan waktu yang sama pada kedua kasus - sekitar 1,564 detik .
Netbeans:
Jadi, sepertinya Netbeans memiliki kinerja buruk di cetak ke konsol.
Setelah penelitian lebih lanjut saya menyadari bahwa masalahnya adalah pembungkus-line buffer maksimum Netbeans (tidak terbatas pada
System.out.println
perintah), ditunjukkan oleh kode ini:Hasil waktu kurang dari 1 milidetik setiap iterasi kecuali setiap iterasi kelima , ketika hasil waktu sekitar 225 milidetik. Sesuatu seperti (dalam nanodetik):
Dan seterusnya..
Ringkasan:
sumber
Ya pelakunya pasti pembungkus kata. Ketika saya menguji dua program Anda, NetBeans IDE 8.2 memberi saya hasil berikut.
Melihat kode Anda dari dekat, Anda telah menggunakan satu baris di akhir loop pertama. Tapi Anda tidak menggunakan garis apa pun di loop kedua. Jadi, Anda akan mencetak kata dengan 1000 karakter di loop kedua. Itu menyebabkan masalah pembungkusan kata. Jika kita menggunakan karakter non-kata "" setelah B, hanya butuh 5,35 detik untuk mengkompilasi program. Dan jika kita menggunakan garis putus-putus pada loop kedua setelah melewati 100 nilai atau 50 nilai, hanya dibutuhkan 8,56 detik dan 7,05 detik .
Saran lain adalah mengubah pengaturan NetBeans IDE. Pertama-tama, buka NetBeans Tools dan klik Opsi . Setelah itu klik Editor dan pergi ke tab Format . Kemudian pilih Anywhere in Line Wrap Option. Butuh hampir 6,24% lebih sedikit waktu untuk menyusun program.
sumber