Da hast du natürlich recht. Aber diese Statistiken müssen ja auchPMV hat geschrieben:Aber jede zu überwachende Optimierung und Statistik benötigt wieder
CPU-Zyklen, die das ganze nicht nur später beschleunigen können,
sondern grundsätzlich ausbremsen. Wie soll das ganze Wissen den
überhaupt angesammelt werden, wenn dadurch nicht zusätzlich
CPU-Zeit verbraten wird?
nicht immer weiterlaufen. Sie können für weitere Ausführungen
gespeichert werden. Und ganz nebenbei ist ein Zähler pro Funktions-
aufruf meist kein Problem. Das ganze Memory-Management (und
die damit verbundenen Statistiken laufen sowieso parallel in einem
eigenen Thread, womit das Hauptprogramm nicht gebremst wird
(Multicore vorausgesetzt)).
Wieso soll sich das System nicht selbst abschalten können? AusserdemPMV hat geschrieben:Ein Code kann nur bis zu einem gewissen
Punkt optimiert werden. Sagen wir, das ist Zustand A. Code, der
durch JIT + Interpreter bearbeitet wird, kann zwar den zu verwalten-
den Code auf den Zustand A bringen, doch insgesamt brauchen alle
Mechanismen zusammen so viel, das es bei Zustand B oder gar C
bleibt. Der Zustand A ist so garnicht erreichbar, dafür müsste sich
das ganze System selber abschalten, nachdem alles kompiliert wurde.
Und wenn dem so wäre, dann könnte man auch direkt das ganze ein mal
optimieren lassen und dann die Daten anbieten, so dass beim ersten
Ausführen sofort der beste Code produziert und das Programm ohne
Overhead perfekt läuft.
kann man C#-Programme sowieso AOT-Compilen, also wie C++. Das
Problem dabei ist natürlich, dass du nicht auf jedem PC der Welt die
Daten sammeln kannst.
DD hat da schon mal 2 Gründe genannt. Den 2. Grund könnte man daPMV hat geschrieben:Und wenn Java (und .NET) dafür garantieren würden, dass der Zustand A
immer erreicht wird, dann frage ich mich, warum zeitintensive Dinge nicht
immer damit realisiert werden? Es wäre ja mit die beste Sprache dann
für so etwas. Sie analysiert zur Laufzeit die besten Optimierungen und
erstellt darauß den besten Maschinencode.
noch etwas ergänzen. Diese Optimierungen benötigen CPU-Aufwand,
keine Frage. Wie also macht man das, ohne das Programm auszubremsen?
Multithreading erlaubt das zu einem gewissen Grad. Viele Optimierungen
benötigen auch zusätzlich Speicher (RAM). Das bedeutet also, das man
eine gewisse Rechenleistung benötigt um die "besten" Optimierungen
durchzuführen. Ausserdem sind für _wichtige_ zeitintensive Anwendungen
auch meist die gesamte Plattform bekannt, wodurch man viele der JIT-
Optimierungen gar nicht benötigt, da man die Compiler-Parameter
entsprechend setzen kann.
Ein ähnliches Problem findet man auch bei der Garbage-Collection. Es
wurde oft gezeigt, dass GC schneller ist, als durchschnittlich programmiertes
manuelles Memory-Management (und oft auch schneller als gut programmiertes
MM). Trotzdem wird GC oft nicht verwendet, da es teilweise unvorhersagbar
ist und oft mehr Speicher für's Management benötigt.
Zum Schluss noch ein kleines Fazit: Irgendwo müssen die Berechnungen
durchgeführt werden, die dann das Programm schneller laufen lassen.
Es ist immer die Frage, ob man die Ausführung eines Programms für
einmal verlangsamen will, damit es das nächste mal schneller laufen
kann. Auch muss abgewogen werden, ob Speicherverbrauch wichtiger
ist als Performance, oder umgekehrt.
greetz
Remi