Mikrooptimierungs tools

Hallo.
Also ich würde mal gerne aus reiner neugier ein bisschen „mikrooptimierung“ betreiben,
nur um es mal ausprobiert zu haben.
könnt ihr mir irgendwelche tools empfehlen, die dann eben die laufzeit in nanosekunden genau angeben
und so weiter, das man eben alles im kleinsten deteil beobachten kann?
Danke :slight_smile:

Was du suchst nennt sich „Profiler“.

zB. VisualVM: http://visualvm.java.net/

Aber weil Mikrooptimierungen sowieso Quark sind, optimiere doch einfach die echten Flaschenhaelse :wink:

Zitat von Michael Jackson (disambiguation) - Wikipedia

„The First Rule of Program Optimization: Don’t do it. The Second Rule of Program Optimization (for experts only!): Don’t do it yet.“

:wink:

ich wills doch nur einmal versuchen :wink: danke ^^

Nur, weil jemand mal nen coolen Spruch gebracht hat, bedeutet das aber nicht zwingend, dass dieser immer gilt!

Grad diesen Spruch find ich eigentlich eher gefaehrlich, denn viele Leuten bringen den staendig und am Ende hat man nicht nur schlechten Code (Code is nie gut genug), sondern eben auch furchtbar langsamen :slight_smile:

Der Punkt am Optimieren ist, dass man die Flaschenhaelse wegoptimiert und nicht an den letzten Millisekunden schraubt (letzteres macht der JIT). So Sachen wie z.B. nen grossen Buffer nur einmal allokieren und anschliessend immer wieder benutzen. Grosse Datenmengen vermeiden und beim Durchsuchen die Menge fruehzeitig reduzieren. Divide & Conquer. Richtige Indexe in der DB setzen. Sinnvolle Datenstrukturen schaffen (z.B. bei Bildverarbeitung die Farbwerte als int speichern und nicht als Color-Objekte).

Ein Profiler ist dafuer perfekt geeignet (solltest dir neben dem oben genannten auch noch JProfiler und Yourkit anguggen, fuer beide gibts Demolizensen). Aber auch Microbenchmarks kann (und sollte) man mal machen. Bei diesen ist wichtig, die Aussagekraft ist sehr beschraenkt und das Ergebnis eigentlich nur dann vergleichbar ist, wenn man sich mal intensiver mit den JIT Optionen der VM auseinander gesetzt hat.

Du kannst auch mal mit nem Disassembler das Compilerergebnis ansehen und verschiedenes ausprobieren. Wirst merken, der Compiler ist schon ziemlich clever :smiley:

Aber grad bei Java ist das allerwichtigste: Brauche niemals zu viel RAM, sonst hast du den GC am Hals und wenn der einen kompletten CPU Kern und massig IO benutzt (Fuer Linux: iotop), wird deine Anwendung auch langsam werden. Is nur nicht so einfach, deshalb sollte man schon ab und an mal nen Profiler anwerfen und sich das ansehen. Man kann nur lernen dabei :wink:

Vielleicht kann man sich streiten, wo “Optimierung” anfängt und was einfach zu “gutem Design” gehört. Natürlich polarisiert dieser Spruch, ich denke mal, das sollte er auch. Flaschenhälse in der Software zählen für mich generell eher zur Kategorie “kein gutes Design”. unter Optimierung stelle ich mir persönlich eher ein Feintuning vor. Wie du schon angemerkt hast, diese ganzen cleveren Gedanken die nur allzuoft vom Compiler wegoptimiert werden (z.B. String-Verkettung). Aber über Definitionen braucht man sich hier nicht streiten, ich stimme deinem Post generell zu.

Auch wenn es vermutlich schon jeder mitliest, hier ein kleiner Backlink zu einem Thema, das hiermit zusammenhängt: http://forum.byte-welt.net/threads/10574-Rotations-und-sonstige-Matrizen/page7?p=73656#post73656

naja, eigentlich ist diese frage unabhängig von diesem post entstanden.