| 

.NET C# Java Javascript Exception

6
Ich habe eine allgemeinere Frage: Meine Logik sagt mir, dass native Sprachen, die direkt auf einer Architektur aufsetzen (Beispiel C++), wesentlich schneller sein müssten, wie beispielsweise Java, die immer eine VM zwischenschalten müssen. Wie kann es dann sein, dass diese trotz eines extra Schritts in der Performance beinahe gleichwertig sind? Woher kommen diese Performance-Boosts?
News:
20.07.2011
Gast
61 1 4
3 Antworten
3
Eine erschöpfende und allgemeingültige Antwort auf die Frage dürfte schwierig bis unmöglich sein, schon allein, weil die der Frage zugrundeliegende Aussage "Java ist fast genauso schnell wie C++" nur cum granum salis sinnvoll zu interpretieren und "richtig" ist.

Ein wesentlicher Baustein ist sicher Just-in-time compilation (der deutsche Artikel dazu ist leider arg knapp geraten). Dadurch wird letztlich in beiden Fällen Maschinencode abgearbeitet.

Ein anderer Aspekt: auch in C++ muss ich irgendwie meinen Speicher verwalten, und wenn ich das ungeschickt anstelle (z.B. viele kleine Stückchen einzeln vom OS anfordere) kann das ziemlich langsam werden. In Java & Co. haben da kluge Leute viel Gehirnschmalz in richtig gute Lösungen gesteckt. Wenn ich in Java ein neues Objekt erzeuge, bekomme ich speichertechnisch schon vorreservierten Speicher, und es wird einfach nur ein Zeiger auf den Beginn des freien Abschnitts verschoben.

So viel mal zum Einstieg in die Diskussion - es kommen bestimmt noch mehr Beiträge ;-)
20.07.2011
Matthias Hlawatsch 13,2k 4 9
2
Bei .net ist die Just-in-time compilation richtig teuer.
Hier bringt das Erstellen von native Images (ngen.exe) einen richtig guten Performance-Boost. Außerdem haben native Images noch den Vorteil, dass der Code bei mehreren Prozessen speichermäßig geshared werden kann.
20.07.2011
CodeSniffer 1,3k 4 9
2
Dass die Performance heute zwischen C++/Assembler und Java/.NET & Co. liegt in meinen Augen zum Einen daran (wie Matthias schon beschrieben hat), dass da wirklich viele schlaue Köpfe lange Nächte drüber sinniert haben und zum anderen aber auch, dass der Normalo-PC heutzutage schon dermaßen leistungsfähig ist, dass die Unterschiede kaum mehr spürbar sind. (die nächsten zeilen bitte nicht mit voller Ernsthaftigkeit sehen :-)

Allerdings gibt es durchaus Anwendungsfälle, in denen Java & Co. sofort durchfallen und überhaupt nicht als Möglichkeit in Betracht gezogen werden (vlt. etwas überspitzt formuliert). Man denke an die vielen embedded Systems, die es heute gibt, das fängt schon bei der von uns so heiß geliebten Kaffeemaschine an. Bei einer Kaffeemaschine würd ich es sogar noch für vertretbar halten, wenn man beispielsweise ein nettes WPF GUI hätte, weil ne Kaffeemaschine keinen harten Echtzeitanforderungen (Gefahr für Leib und Leben) genügen muss. Bei einer Bremse im Auto (brake by wire) gelten da andere Regeln. Wenn man aufs Bremspedal drückt und das System lässt sich mal geschmeidig 5 Sekunden Zeit, weils vielleicht gerade eine Garbage Collection macht, kann das böse enden. Harte Echtzeitanforderungen wird man also mit nicht-deterministischem Verhalten in Laufzeitumgebungen (z.B. die eben angesprochene GC) nicht vollends erfüllen können. Warum auch? Sie sind für etwas anderes gemacht.

Auf der anderen Seite gibt es Anwendungen, die mit wenigen KB Speicher und nem Miniprozessor mit einem Bruchteil der Leistung heutiger Handys auskommen müssen. Ob da dann noch C++ eingesetzt wird, kann ich nicht sagen, aber wenn es um Massenproduktion geht und man ein paar KB Speicher einsparen kann und die Algorithmen so optimiert, dass ein kleinerer Prozessor reicht, dann fällt das monetär erheblich ins Gewicht.

Soviel mal im Moment von meiner Seite.

Gruß
Florian
20.07.2011
ffordermaier 8,4k 3 9

Stelle deine Java-Frage jetzt!