Ansicht umschalten
Avatar von CeliaGrosse
  • CeliaGrosse

mehr als 1000 Beiträge seit 14.12.2005

Zwei Java-Wünsche ...

Ich wünsche mir für kommende Versionen von Java-Runtime zwei
Features:
1. Einen Systemprozess der läuft sobald das erste Java-Programm
anläuft und dann die Datenfluss-Analyse der Klassen und Methoden in
den Java-Classfiles (das wird zur JIT-Optimierung gebraucht) zentral
durchführt und diese Information an die VMs weitergibt
(sinnvollerweise per Shared-Memory). Desweiteren sollen diese
Informationen auf der Patte gecacht werden (die Aktualität könnte
z.B. via SHA-Hash des Classfiles überprüft werden) so daß sie beim
nächsten Start einer Anwendung komplett zur Verfügung stehen. Das
sollte einiges an Performace für den Anwendungs-Start bieten.
2. Objekte die die Eigenschaften von Werttypen haben, also nicht
alleine, sondern nur über das enthaltende Objekt bzw das enthaltende
Array referenzierbar sind. Das sollten dem Compiler ermgölichen im
Falle von "Wert-Objekten" die in anderen Objekten enthalten sind,
diese nebeneinanderliegend im RAM anzuorden; was Datenstrukturen sehr
viel Cache-freundlicher macht. Im Falle von Arrays liegen dann die
Objekte auch sequentiell im RAM was nicht nur die
Cache-freundlichkeit erhöht, sondern bei linearen Zugriffen das
Prefetching der CPU erst ermöglicht.
Mir ist klar, daß dieses Feature zum Teil auch über eine
Datenfluss-Analyse erreicht werden kann; aber das ist sehr aufwändig
und geht eben nur zum Teil. Deswegen bietet dotNet z.B. schon seit
der ersten Version Objekte die wie Werttypen gespeichert werden.
Dummerweise sieht man das dort dem jeweiligen Objekt nur an der
Stelle an an der es definiert hat und nicht beim Zugriff; d.h. da
steht dann z.B. einfach referenz.subobjekt - was die Wert-Semantik
verdeckt. Ich fänd es gut wenn diese Variablen eine spezielle Syntax
bekommen, und zwar in folgender Form:

public class XYZ
{
    private ABC  referenziertesAbcObjekt;
    private ABC @enthaltenesAbcObjekt;
    private ABC  arrayMitReferenziertenObjekten[];
    private ABC @arrayMitEnthaltenenObjekten[];
}

Die enthaltenen Objekte würden dann folgendermaßen angesprochen:
... "xyzObjekt.@enthaltenesAbcObjekt" ...
... "xyzObjekt.@arrayMitEnthaltenenObjekten[i]" ...

Diese Maßnahmen würden Java sicherlich einiges an Performance-Zuwachs
bringen. Es wird ja immer behauptet, daß Java sich mit C/C++ messen
könne; aber das halte ich z.B. aus dem Grund, daß diese Features
fehlen (und sich nur zum Teil durch eine Datenfluss-Analyse erreichen
lassen) für Unsinn. Java mag für das für was es genutzt wird fast
immer hinreichend schnell sein, aber eine Java-Lösung kann bei den
meisten Problemstellungen sich in Sachen Performance sich nicht mit
einigermaßen optimiertem C/C++-Code messen.
Bewerten
- +
Ansicht umschalten