Wygenerowałem dwie macierze 1000
x 1000
:
Pierwsza matryca: O
i #
.
Druga matryca: O
i B
.
Przy użyciu następującego kodu wykonanie 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("");
}
W przypadku tego kodu wykonanie drugiej macierzy zajęło 259,152 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("B"); //only line changed
}
}
System.out.println("");
}
Jaki jest powód dramatycznie różnych czasów pracy?
Jak sugerowano w komentarzach, drukowanie System.out.print("#");
zajmuje tylko 7.8871
sekundy, a System.out.print("B");
daje still printing...
.
Jak inni, którzy zauważyli, że działa dla nich normalnie, próbowałem na przykład Ideone.com i oba fragmenty kodu działają z tą samą prędkością.
Test kondycji:
- Uruchomiłem ten test z Netbeans 7.2 z wyjściem na konsolę
- Użyłem
System.nanoTime()
do pomiarów
java
performance
loops
for-loop
system.out
Kuba Spatny
źródło
źródło
Odpowiedzi:
Czysta spekulacja polega na tym, że używasz terminala, który próbuje zawijać słowa, a nie znaków, i traktuje je
B
jako znak słowa, ale#
jako znak inny niż słowo. Kiedy więc dotrze do końca linii i szuka miejsca, w którym można ją przełamać, widzi#
niemal natychmiastowe i szczęśliwe zerwanie ; podczas gdy zB
, 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. wypisywanie spacji, a następnie wypuszczanie spacji w celu zastąpienia pakowanych liter).Ale to czysta spekulacja.
źródło
B
rozwiązaniu go.System.out.println
nie robi zawijania tekstu; chodziło tylko o zawijanie słów (i blokowanie, więcSystem.out.println
musiałem czekać).Przeprowadził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:
W obu przypadkach dostałem ten sam czas - około 1,564 sekundy .
Netbeans:
Wygląda więc na to, że Netbeans ma słabą wydajność w drukowaniu na konsoli.
Po dalszych badaniach zdałem sobie sprawę, że problemem jest zawijanie wiersza maksymalnego bufora Netbeans (nie ogranicza się do
System.out.println
komend), czego dowodem jest ten kod:Wyniki czasu są mniejsze niż 1 milisekunda dla każdej iteracji, z wyjątkiem co piątej iteracji , gdy wynik czasu wynosi około 225 milisekund. Coś w stylu (w nanosekundach):
I tak dalej..
Podsumowanie:
źródło
Tak, winowajcą jest zdecydowanie zawijanie słów. Kiedy przetestowałem twoje dwa programy, NetBeans IDE 8.2 dał mi następujący wynik.
Przyglądając się dokładnie kodowi, użyłeś podziału linii na końcu pierwszej pętli. Ale nie użyłeś żadnego podziału linii w drugiej pętli. Zamierzasz więc wydrukować słowo zawierające 1000 znaków w drugiej pętli. To powoduje problem z zawijaniem słów. Jeśli użyjemy nie-słownego znaku „” po B, skompilowanie programu zajmuje tylko 5,35 sekundy . A jeśli zastosujemy podział linii w drugiej pętli po przejściu 100 wartości lub 50 wartości, zajmie to odpowiednio tylko 8,56 sekundy i 7,05 sekundy .
Kolejna rada to taka, aby zmienić ustawienia IDE NetBeans. Przede wszystkim przejdź do NetBeans Tools i kliknij Opcje . Następnie kliknij Edytor i przejdź do zakładki Formatowanie . Następnie wybierz Anywhere in Line Wrap Option. Skompilowanie programu zajmie prawie 6,24% mniej czasu.
źródło