środa, sierpnia 08, 2012

Java na Raspberry Pi zaskakuje ;-)

Kto pisze w Java'ie ten może zna pewną sztuczkę na przyśpieszenie kodu. W kodzie produkcyjnym lepiej użyć jako zmiennych klas konkretnych niż interfejsów.
Znaczy zamiast List<Integer> list = new ArrayList<Integer>(); z powodów wydajnościowych lepiej użyć ArrayList<Integer> list = new ArrayList<Integer>(); 
Taka lista będzie szybsza o 30% do 60%.
JVM nie musi tak bardzo skakać po metodach wirtualnych i takie tam.
Google nawet poleca tą sztuczkę w developmencie dla Androida, jako coś co może pomóc. Znaczy coś jest na rzeczy ;-) [powtarzam w kodzie produkcyjnym, nie tym w developmencie].
Niestety na Pi to nie działa...... ba nawet wyniki mogą być gorsze ;-)
W moim teście na PC wersja z klasą konkretną potrzebowała 45% czasu wersji z interfejsem... na Pi potrzebowała 101% ;-)
Przez to kod na Pi wykonywał się 1834 razy wolniej, a mógł 815 razy wolniej ;-)
Zresztą praca z kolekcjami na Pi jest szczególnie wolna. Tworzenie nowych obiektów czy operacje z łańcuchami (ohydne str+=""+i) są na Pi jakieś 450 razy wolniejsze niż na PC, arytmetyka jakieś 50 razy, a operacje na listach od 800 do 1800 razy wolniejsze ;-)

Btw. macie jakieś pomysły na dobre przetestowanie wydajności Java'y? Ogólnie chodzi mi o coś co pozwoliłoby na stworzenie kilku zasad, których bym mógł przestrzegać pisząc na Pi ;-)

#toBlogger

[Go to original post on Google+]




Podobne postybeta
Nie taka klasa konkretna straszna....
Który kod (nie kot! ;-)) lepszy?
Java 8 nadchodzi....
Giń konstruktorze! Giń! ;-)
GCJ mnie przerosło ;-)

2 komentarze:

  1. Operator + dla Stringów (swoją drogą chyba jedyny wyjątek od zasady że w Javie nie ma przeciążania operatorów) nie jest aż tak ohydny jak się wydaje. Oczywiście, warto go unikać ale przyzwoite kompilatory Javy (a przynajmniej ten od Oracle'a) zamieniają operacje konkatenacji ciągów znaków które nie są stałymi kompilacji na wywołania metod StringBuilder-a.

    OdpowiedzUsuń
  2. Aler należy pamiętać, że do StringBuildera optymalizowane są tylko deklaracje typu;
    String a = "Ala " + "ma"+ " kota!";

    a już
    String a = "Ala ";
    a=a+"ma";
    a=a+" kota!";
    nie zostanie zoptymalizowana.

    OdpowiedzUsuń