Dlaczego drukowanie " B " jest znacznie wolniejsze niż drukowanie "#"?

Wygenerowałem dwie macierze 1000 x 1000:

Pierwsza macierz: O i #.
Druga macierz: O i B.

Używając poniższego kodu, ukończenie pierwszej matrycy zajęło 8,52 sekundy:

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

Z tym kodem, Ukończenie drugiej matrycy zajęło 259.152 sekund:

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

Jaki jest powód dramatycznie różnych czasów biegu?


Zgodnie z sugestią w komentarzach, drukowanie tylko System.out.print("#"); zajmuje 7.8871 sekund, podczas gdy System.out.print("B"); daje still printing....

Jako inni, którzy wskazywali, że działa dla nich normalnie, próbowałem Ideone.com na przykład, i oba fragmenty kodu wykonują się z tą samą prędkością.

Warunki Badania:

    [[34]} uruchomiłem ten test z Netbeans 7.2 , z wyjściem do konsoli
  • użyłem System.nanoTime() do pomiarów
Author: chŝdk, 2014-02-22

2 answers

czysta spekulacja polega na tym, że używasz terminala, który próbuje wykonać owijanie wyrazów zamiast owijania znaków i traktuje {[0] } jako znak wyrazowy, ale # jako znak nie-wyrazowy. Tak więc, gdy dociera do końca linii i szuka miejsca, w którym można ją złamać, widzi # prawie natychmiast i szczęśliwie się tam łamie; podczas gdy z B, musi szukać dłużej i może mieć więcej tekstu do zawinięcia (co może być kosztowne na niektórych terminalach, np., wyprowadzanie spacji wstecznych, a następnie wyprowadzanie spacji w celu nadpisania zawiniętych liter).

Ale to czysta spekulacja.
 3762
Author: T.J. Crowder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-13 07:16:29

Wykonałem testy na Eclipse vs Netbeans 8.0.2, oba z Javą w wersji 1.8; Użyłem System.nanoTime() do pomiarów.

Zaćmienie:

Mam ten sam czas w obu przypadkach - około 1,564 sekundy .

Netbeans:

  • za pomocą "#": 1.536 seconds
  • Using" B": 44.164 seconds

Wygląda na to, że Netbeans ma kiepską wydajność przy drukowaniu na konsoli.

Po dalszych badaniach zdałem sobie sprawę, że problem jest to owijanie linii maksymalnego bufora Netbeans (nie jest ograniczone do polecenia System.out.println), pokazane przez ten kod:

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

Wyniki czasowe są mniejsze niż 1 milisekunda co iterację z wyjątkiem co piątą iterację, gdy wynik czasowy wynosi około 225 milisekundy. Coś w rodzaju (w nanosekundach):

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

I tak dalej..

Podsumowanie:

  1. Eclipse działa doskonale z " B "
  2. Netbeans ma problem zawijania linii, który można rozwiązać (ponieważ problem nie występuje w eclipse) (bez dodawania spacji po B ("B ")).
 158
Author: Roy Shmuli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-17 21:34:55