2013-03-08 6 views
6

Aby napisać dobry test testu porównawczego, trzeba go uruchomić kilka tysięcy (milionów) razy. Zrównuje (w większości przypadków) wpływ innych programów.Jak przeprowadzić dobry test porównawczy wydajności?

Ale jeśli JVM może mieć wpływ na wyniki. Na przykład:

Pierwsze rozwiązanie jest:

final StringBuilder stringBuilder = new StringBuilder(); 
    stringBuilder.append(getStrOne()); 
    stringBuilder.append(getStrTwo()); 
    final String result1 = stringBuilder.toString(); 

I drugie:

final String result2 = getStrOne() + getStrTwo(); 

Nie wiem, który z nich jest lepszy, ponieważ JVM może wpływać na wyniki. Jak się dowiedzieć, który z nich jest lepszy?

UPDATE: Nie mam na myśli dokładnie , że dołącza test komparacji. Pytam o taką trudną do przetestowania sytuację .

+2

Co masz na myśli, jeśli JVM może wpłynąć na wyniki? – ddmps

+1

Drugi zostanie przekonwertowany na 'final String result2 =" str1str2 ";' przez kompilator ... – assylias

+0

@Pescis Na przykład buforowanie. –

Odpowiedz

2

Niedawno przeprowadziłem testy porównawcze, które opierały się na znakomitym artykule IBM, który można znaleźć tutaj: http://www.ibm.com/developerworks/java/library/j-benchmark1/index.html.

W artykule opisano wiele pułapek, które mogą mieć wpływ na dokładność wyników, na przykład: optymalizacja

  • Runtime/re-kompilacji kodu.
  • Martwe eliminacja kod (tj niewykorzystane wyniki mogą powodować kod testowy do usunięcia)
  • Garbage collection
  • buforowanie
  • ...

Wreszcie linki artykuł do miejsca, w którym struktura może być downloaded. Struktura bardzo dobrze sprawdza się w buforowaniu metody testowania, poszukiwaniu dowodów rekompilacji i czekaniu na rozliczenie czasu wykonania.

0

W przypadku 2 ciągi, różnice w wynikach są znikome, ale spróbuj wykonać następujące czynności:

String s = ""; 
for(int i = 0; i < 10000; i++) { 
    s += i; 
} 

vs.

StringBuilder b = new StringBuilder(); 
for(int i = 0; i < 10000; i++) { 
    b.append(i); 
} 

Znajdziesz że druga pętla jest sposób szybciej. Czemu? Ponieważ konkatenacja ciągów tworzy w każdej iteracji nowy obiekt String, co powoduje marnowanie cykli procesora, a także pamięci.

będę cytować cię:

napisać dobry test test comparations trzeba przetestować kilka tysięcy (miliony) razy. Zrównuje (w większości przypadków) wpływ innych programów.

To samo odnosi się do testów w ramach jednego VM: przetestować kod wielokrotnie użyć większych danych, większe pętle itp Porównywanie tylko małe porcje nie ma sensu z powodu błędów pomiaru czasu precyzji i inne czynniki (np wywóz śmieci pomiędzy).

Powiązane problemy