Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#23

Re: DLL systemunabhängig?

  Alt 14. Aug 2007, 15:53
Zitat von Angel4585:
Und in welchen Bereichen ist Java jetzt genausoschnell oder gar schneller und wo ist es langsamer?
Kann mich nur wiederholen, kann man nicht pauschal sagen, kommt auf den Code an. An sich ist Java (bei wirklich gleichwertigen Datenstrukturen und Algorithmen) immer etwas langsamer als ein gleichwertiges natives Programm. Häufig wird hier einfach gesagt, dass das daran liegt, dass Java-Code in einer virtuellen Maschine ausgeführt wird. Der Java Compiler (javac) erstellt nur Objektcode, der eben auf dieser virtuellen Maschine ausgeführt wird. Überall, wo es eine Implementierung der virtuellen Maschine gibt, ist dann der Code auch lauffähig (genau das macht die Plattformunabhängigkeit aus). .net verwendet das gleiche Prinzip. Anders als bei einem Interpreter ist der Code dabei schon in einen assembler übersetzt, die Korrektheit schon geprüft, die Anweisungen sind schon kodiert.
Java ist also schon mal schneller, als wenn Du wiederum exakt gleiche Algorithmen und Datenstrukturen in einem Interpreter ausführst. Da Du aber i.d.R. keine Architektur besitzt, die der der JVM entspricht, muss der Code noch in solche übersetzt werden, der von Deiner Maschine verstanden wird. Hier kommt ein Just In Time Compiler (JIT) zum Einsatz. Während dieser die Instruktionen einliest versucht der diese auf Dein System zu optimieren und übersetzt die für die Zielplattform, wo sie dann auch ausgeführt werden. Das kostet natürlich etwas Zeit und ist damit langsamer als ein gleichartiges Programm, dass schon komplett für diese Zielplattform gelinkt vorliegt. Letzteres kann eben direkt ausgeführt werden, die Übersetzung durch den JIT entfällt.

Jetzt ist es aber nicht so, dass alle Sprachen exakt gleich arbeiten. So könnte ich immer behaupten, dass C Code schneller ist als solche in ObjektOrientierter C++ Code. Einfach weil C keine Objekte kennt und diese einen gewissen Overhead mit sich bringen. Auch kümmert sich C recht wenig um Typsicherheit, in C++ sieht das anders aus. Jedes try... except bedeutet eine Verlangsamung, Indirektionen durch die Verwendung von Objekten und insbesondere bei virtuellen Methoden kommen dann noch hinzu.
Nichts desto trotz wird häufig auch Objekt Orientiert programmiert, da dies ganz andere Möglichkeiten und Vorteile als die rein imperative Programmierung bietet. Ein schönes Beispiel ist vielleicht gleich J2EE (Java 2 Enterprise Edition), deren Vorteile erst durch die OOP erreicht werden, z.B. die einfache Skalierung und die automatische Nebenläufigkeit.
Aber es gibt noch weitere Unterschiede, so verwaltet Java seinen Speicher selbst, es gibt keine (expliziten) Destruktoren. Während Du in C/C++ einfach mal einen Destruktor-Aufruf vergessen kannst und Dir damit den Speicher zumüllst, wird in Java von Zeit zu Zeit (läuft asynchron) die Garbage Collection aufgerufen, die einfach allen Speicher, der nicht mehr benötigt wird, aufräumt. Hast Du einen solchen Destruktor an einer ungünstigen Stelle vergessen, dann dürfte ein voller Speicher Dein Programm ordentlicher ausbremsen als vieles anderes.

Zudem sind natürlich die Bibliotheken in Java und C++ (oder anderen Sprachen) auch unterschiedliche aufgebaut. Je nach Implementierung (die muss auch nicht in jeder Version gleich sein, ein Vorteil von Abstraktion), kann dann die eine oder andere Sprache eine deutlich schnellere Implementierung verwenden.
Die Unterschiede zwischen C++ und Java mögen hier für die meisten Programme noch gut messbar sein, aber nicht unbedingt spürbar! Da spielen andere Faktoren eine viel wichtigere Rolle. Jeder sich bewegende Fortschrittsbalken bzw. sein Fehlen macht psychologisch doch deutlich mehr aus (da ist der Gefühlte Unterschied immens!)

[add]
Kein roter Kasten, na toll.

Zitat von OregonGhost:
Zumindest anschauen solltest du es dir als Alternative zu Java auf jeden Fall.
Oder wie bereits erwähnt auch als Ergänzung!
[/add]
  Mit Zitat antworten Zitat