Kodėl „B“ spausdinimas yra daug lėtesnis nei „#“ spausdinimas?

Sukūriau dvi 1000 x 1000 matricas:

Pirmoji matrica: O ir # .
Antroji matrica: O ir B

Naudojant šį kodą, pirmoji matrica užtruko 8,52 sekundes:

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

Su šiuo kodu antrasis matrica užtruko 259,152 sekundes, kad užbaigtų:

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

Kokia yra aštrių skirtingų vykdymo laikų priežastis?


Kaip nurodyta komentaruose, tik spausdinkite „ System.out.print("#"); trunka 7.8871 sekundes, o System.out.print("B"); suteikia still printing...

Kaip ir kiti, kurie nurodė, kad jie veikia gerai, aš bandžiau „ Ideone.com“ , o abi kodo dalys veikia tuo pačiu greičiu.

Bandymo sąlygos:

  • Bandau šį testą su „Netbeans 7.2“, turėdamas prieigą prie konsolės
  • Norėčiau System.nanoTime()
2524
22 февр. Kuba Spatny nustatė vasario 22 d 2014-02-22 02:45 '14, 2:45 2014-02-22 02:45
@ 2 atsakymai

Gryna spekuliacija yra ta, kad jūs naudojate terminalą, kuris bando daryti žodinį įvyniojimą , nesupakuoti simbolių ir traktuoja B kaip žodinį simbolį, bet # kaip ne žodinį simbolį. Todėl, kai jis pasiekia linijos pabaigą ir ieško vietos laužyti liniją, jis mato # beveik iš karto ir laimingai pertraukas; kadangi, naudojant B jis turi toliau ieškoti ilgesnio ir gali turėti daugiau teksto (kai kurie terminalai gali būti brangūs, pavyzdžiui, atsiimti atgalines vietas, o po to išsiųsti flip raidžių perrašymo vietas).

Bet tai yra tik spekuliacija.

3833
22 февр. Atsakymą pateikė TJ Crowder vasaris 22. 2014-02-22 03:02 '14 at 3:02 2014-02-22 03:02

Bandžiau atlikti „Eclipse vs Netbeans 8.0.2“ testus, kaip ir Java 1.8 versijoje; System.nanoTime() naudoju System.nanoTime() .

„Eclipse“:

Abiem atvejais tuo pačiu metu gavau apie 1564 sekundes .

„Netbeans“:

  • „#“ Naudojimas: 1,536 sekundės
  • „B“ naudojimas: 44,164 sekundės

Taigi, „Netbeans“, atrodo, turi mažą konsolės našumą.

Po daugiau tyrimų aš supratau, kad problema yra „noreferrer“> linijos apvyniojimas maksimalaus „Netbeans“ buferio (tai neapriboja „ System.out.println komanda), kurią parodo šis kodas:

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

Laiko rezultatai yra mažesni nei 1 milisekundė kiekviename iteracijos metu, išskyrus kiekvieną penktą iteraciją , kai rezultatas yra apie 225 milisekundes. Kažkas panašaus (nanosekundėmis):

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

Ir taip toliau ..

Santrauka:

  • „Eclipse“ puikiai veikia su „B“
  • „Netbeans“ turi eilutės pertraukos problemą, kuri gali būti išspręsta (nes problema nėra užtemdoma) (be B („B“)).
173
03 апр. Atsakymas, kurį pateikė Roy Shmuli Apr 03 2015-04-03 18:01 '15 at 18:01 2015-04-03 18:01

Kiti klausimai apie „ arba Ask a Question