Freitag, 26. November 2010

Optimierung von Endrekursionen in Java

In meinem letzten Post (Funktionale Programmierung mit Java) musst ich noch zugeben, dass ich nicht wusste ob Java Optimierungen von Endrekursionen (Tail Recursion) beherrscht. Nach einem kleinen Test, kann ich sagen, das Java 1.6 diese Optimierung beherrscht. Getestet habe ich mit:

java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04-307-10M3261)
Java HotSpot(TM) 64-Bit Server VM (build 17.1-b03-307, mixed mode)


Der optimierte Code läuft um den Faktor 4 bis 5 schneller. Dies ist enorm! Beim Code handelt es sich um eine modifizierte Version von Blackflash (Andre Mölle). Andre Mölle vergleicht funktionale Programmierung in Java und anderen Programmiersprachen mit und ohne Endrekursionen (Link). Bei ihm gab es keine Unterschiede zwischen optimiertem und nicht optimiertem Code. Was aber an verschiedenen Dingen liegen kann. Mein Ergebnis steht damit im Widerspruch zu dem Ergebnis von Andre Mölle aus dem Jahr 2008. Man kann diese Unterschiede mit verschiedenen Versionen der Java VM/Compiler begründen. Leider habe ich kein passendes Dokument von Sun/Oracle zu diesem Thema gefunden.
Mit diesem Ergebnis können auch imperative, normale Programmierer ihren Code optimieren, in dem sie ihre rekursiven Funktionen endrekursiv umbauen. Noch ein Tip zu letzt,  bei Java ist natürlich die Vergrösserung des Stacks der JVM (-Xss) wichtig, wenn man mit Rekursionen arbeitet.

Keine Kommentare:

Kommentar veröffentlichen