Mam duży problem podczas oceniania mojego kodu Java. Aby uprościć problem, napisałem poniższy kod, który wywołuje to samo dziwne zachowanie. Ważna jest metoda run() i podana podwójna wartość rate. Dla mojego testu wykonawczego (w metodzie głównej) ustawiłem stawkę na 0,5 jeden raz i 1,0 na drugi czas. Przy wartości 1.0 instrukcja if będzie wykonywana w każdej iteracji pętli, a przy wartości 0,5 instrukcja if będzie wykonywana o połowę mniej. Z tego powodu spodziewałem się dłuższego czasu pracy w pierwszym przypadku, ale jest odwrotnie. Czy ktoś może mi wyjaśnić to zjawisko?Ciekawa wydajność Java Loop Performance
Wynik główny:
Test mit rate = 0.5
Length: 50000000, IF executions: 25000856
Execution time was 4329 ms.
Length: 50000000, IF executions: 24999141
Execution time was 4307 ms.
Length: 50000000, IF executions: 25001582
Execution time was 4223 ms.
Length: 50000000, IF executions: 25000694
Execution time was 4328 ms.
Length: 50000000, IF executions: 25004766
Execution time was 4346 ms.
=================================
Test mit rate = 1.0
Length: 50000000, IF executions: 50000000
Execution time was 3482 ms.
Length: 50000000, IF executions: 50000000
Execution time was 3572 ms.
Length: 50000000, IF executions: 50000000
Execution time was 3529 ms.
Length: 50000000, IF executions: 50000000
Execution time was 3479 ms.
Length: 50000000, IF executions: 50000000
Execution time was 3473 ms.
Kodeks
public ArrayList<Byte> list = new ArrayList<Byte>();
public final int LENGTH = 50000000;
public PerformanceTest(){
byte[]arr = new byte[LENGTH];
Random random = new Random();
random.nextBytes(arr);
for(byte b : arr)
list.add(b);
}
public void run(double rate){
byte b = 0;
int count = 0;
for (int i = 0; i < LENGTH; i++) {
if(getRate(rate)){
list.set(i, b);
count++;
}
}
System.out.println("Length: " + LENGTH + ", IF executions: " + count);
}
public boolean getRate(double rate){
return Math.random() < rate;
}
public static void main(String[] args) throws InterruptedException {
PerformanceTest test = new PerformanceTest();
long start, end;
System.out.println("Test mit rate = 0.5");
for (int i = 0; i < 5; i++) {
start=System.currentTimeMillis();
test.run(0.5);
end = System.currentTimeMillis();
System.out.println("Execution time was "+(end-start)+" ms.");
Thread.sleep(500);
}
System.out.println("=================================");
System.out.println("Test mit rate = 1.0");
for (int i = 0; i < 5; i++) {
start=System.currentTimeMillis();
test.run(1.0);
end = System.currentTimeMillis();
System.out.println("Execution time was "+(end-start)+" ms.");
Thread.sleep(500);
}
}
Prawdopodobnie coś z [gałąź (nie-) przewidywania] (http://stackoverflow.com/questions/11227809/why- przetwarzanie-posortowana-tablica-szybsza niż-nieposortowana-tablica). – assylias
Losowe jest dość powolne tutaj. Sugeruję, abyś postępował zgodnie z prostym postępem i nie będziesz spędzać większość czasu na generowaniu liczb losowych. Proponuję Ci alternatywne testy, zamiast uruchamiać je wiele razy i wielokrotnie uruchamiać drugie. (Nie musisz spać między nimi) –
myślisz rozgrzać co jeśli najpierw wykonasz 1.0? – ssedano