Ist C++ performanter als Java? In welchen Bereichen ist welche von beiden performanter?

10 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Generell kann man sagen, dass C++ schneller ist, aber erstens trifft das nicht immer zu 100% zu, und zweitens ist Performance auch nicht immer alles.

Diese Aussage wird klarer werden, wenn ich auf die einzelnen Punkte deiner Frage eingehe (bitte beachte dazu auch die Relativierungen am Ende meiner Antwort!):

  1. Scheduled Repeating Tasks: Interessanterweise ist genau das einer der Punkte, bei denen Java vorne liegen wird. Und zwar arbeitet der Java Scheduler im Userspace, wodurch die teuren Kontextwechsel bei Threads und Prozessen auf Betriebssystemebene wegfallen. Allerdings dürften diese "Vorteile" auf Seiten von Java recht schnell dadurch aufgefressen werden, dass der im Greenthread ausgeführte Code langsamer läuft als C++ Maschinencode. Im Endeffekt dürfte also C++tatsächlich immer noch vorne liegen, falls der Java Thread nicht sofort yield() aufruft.
  2. Komplexe Berechnungen (int, short, float, ...): Auf jeden Fall ist auch hier C++ schneller. Allein schon, dass es in Java keine vorzeichenlosen Typen gibt, erschwert viele Berechnungen enorm, und man muss mit obligatorischen Masken (0xffff) arbeiten. Beispiel: Ein PCM-Sample von signed in unsigned umwandeln (was wohlgemerkt nichts mit der internen Darstellung von vorzeichenbehafteten Ganzzahlen zu tun hat), wird mit Java nur sehr sehr unschön möglich sein. Der Java-Compiler ist zwar sehr gut darin, zu erkennen, ob ein vorzeichenbehafteter Typ als vorzeichenlos behandelt werden soll, aber das macht den Code a) nicht schöner, und b) schon gar nicht schneller.
  3. Verwendung von vielen Variablen (Strings, Maps, etc.): Java verfügt seit einigen Versionen über die Fähigkeit, Zeiger zu "komprimieren", sodass eben diese auf einem 64-Bit-System nur noch 32 Bit belegen. Allerdings wird auch dieser Punkt dadurch aufgefressen, dass Java Referenzen zählt (zwecks GC) und noch einiges andere Schindluder treibt. Deshalb verbraucht z. B. ein Objekt, welches einfach nur aus einem public Integer besteht, in Java 24 Byte, in C++ hingegen 4 Byte. Dieser Unterschied ist enorm, und macht sich besonders beim Number-Crunching deutlich bemerkbar.
  4. Zugriff auf Datenbanken: In diesem Punkt ist es einerlei, ob du Java oder C++ benutzt, da die Programmiersprache hierbei nur den Klebstoff für deinen eigenen Code und die Datenbank-API bereit stellt. Ich würde behaupten, dass es hier keinen messbaren unterschied macht, ob du C, C++, Java, PHP, Ruby, Perl, Python, C#, oder gar einen BASIC-Dialekt verwendest. Das ist übrigens auch der Grund dafür, dass man 3D Spiele auch z. B. mit Python schreiben kann, da die Hauptaufgabe die Grafikengine übernehmen wird, welche dann wiederum höchstwahrscheinlich in C++ geschrieben ist. Das gleiche gilt für Datenbanksysteme ... es gibt zwar auch reine Java-Implementierungen (genauso wie bei besagten Grafik-Engines), aber eine baugleiche C++ Implementierung dürfte immer die Nase vorn haben.
  5. 2D & 3D Spiele: Wie im vorigen Punkt angedeutet, wäre es fast schon töricht, eine Engine NICHT in C++ schreiben zu wollen, es sei denn, es handelt sich um ein Proof-Of-Concept, oder eine Nischenanwendung. (gibt es allerdings tatsächlich, auch in Java!) Allerdings dürften die wenigsten Leute ihre Engine selber schreiben, und als Klebstoff ist es - wie bereits erwähnt - auch völlig legitim Java zu verwenden! Allerdings wird es eng werden, wenn der Klebstoff irgendwann mal mehr sein will, als nur Klebstoff, und dann steckt man in einer Sackgasse, da man in diesem Stadium der Entwicklung ja nicht einfach mal so die Programmiersprache wechseln kann. Aber dass Spiele in Java möglich sind, zeigt Minecraft. Es wäre allerdings völlig illusorisch zu glauben, dass grafisch Anspruchsvolle Engines wie die Unreal-Engine allein in Java realisierbar wären. Hierbei hat man gar keine andere Wahl, außer C++ zu nehmen! Allerdings dürfte das alles für die meisten kleinen Casual-Games egal sein, und auch mit Java dürften kleine Teams hier sehr weit kommen.
  6. Multi-Core & Multi-Threading: Das ist eine sehr hardwarenahe Angelegentheit. Java unterstützt ja auch schon seit Ewigkeiten Threads und gar Prozesse. Für C++ gab es dafür seit jeher Bibliotheken und seit ein paar Jahren unterstützt C++ auch ganz offiziell in der STL Nebenläufigkeit. (C++ hat sogar das Speichermodell von Java übernommen, weil dieses im Hinblick auf Nebenläufigkeit so ausgereift war!) Im Großen und Ganzen nehmen sich hier C++ und Java nicht soooo viel, aaaaaber bei Spezialanwendungen dürfte man mit C++ weniger Konfigurationsabenteuer haben, als mit Java. Um einen speziellen Thread auf einer speziellen CPU ausführen zu können, die beim Bootvorgang für Profilingzwecke vom Betriebssystem für alle anderen Prozesse "freigehalten" wird, kommst du mit C++ stressfreier ans Ziel, ohne an gefühlt einer Million Schrauben drehen zu müssen. Außerdem ist C++ mehr Low-Level und damit für die hardwarenahe Aufgabe Multiprocessing besser geeignet. Es ist mit C++ einfacher, Betriebssystemspezifische Operationen und Syscalls aufzurufen, die den normalen Programmfluss nicht gegen die Wand fahren. (Kannst ja mal von Java aus fork() über JNI aufrufen ... viel Spaß!)

Mmmmh, also bis hier hin scheint C++ vorne zu liegen. Ist C++ deshalb jetzt besser? Klare Antwort: Nein! :)

Denn Java bringt im JRE eine unvergleichbar größere "Standardbibliothek" mit. Verglichen damit, ist die STL von C++ winzig. Allein so etwas wie Javas "String.trim()" gibt es bei C++ nicht und man muss sich selber etwas basteln. Hierbei hat man dann zwar mehr Kontrolle darüber, was wie passiert, aber ob man das möchte, muss jeder für sich entscheiden.

Beide Sprachen sind unterschiedliche Werkzeuge für unterschiedliche Aufgaben, und eigentlich sind beide gar nicht vergleichbar ... denke ich zumindest. :)

Beide Sprachen verfügen über ein syntaktisch ähnliches Exception-Handling, aber die Programmier-konzepte sind so krass unterschiedlich, dass man C++ Code nicht in Java und umgekehrt übersetzen kann oder sollte. (Bei C++ verwendet man RAII, bei Java try-with-Ressources ... beides völlig inkompatibel, aber mit dem gleichen Grundgedanken)

Beide Sprachen kann man mit und ohne Garbage-Collector laufen lassen. Bei Java ist dieser Standardmäßig aktiviert, und 99% des Java-Universums basieren darauf. Bei C++ verwendet man i. d. R. keinen GC sondern eher Scope-Based-Container (Smart-Pointer, vector<>, etc.), was wesentlich performanter ist. Allerdings kann man seinen C++ Code auch mit aktiviertem GC ausführen ... was allerdings dem Paradigma von ebenso 99% des C++ Universums widersprechen dürfte. :)

Die Lernkurve ist bei C++ viel viel steiler als bei Java, aber dafür bietet C++ auch generische Programmierung, von der Java nur träumen kann. (Java Generics sind ein Witz, verglichen mit C++ Templates.) Allerdings werden Anfänger mit Java schneller Erfolge erzielen können.

Java bietet aber auch sehr schöne APIs an, auf die der C++ler prinzipbedingt verzichten muss: Reflection zum Beispiel. :)

Naja, aber darum ging es in deiner Frage ja nicht, sondern nur um Performance.

Fazit: Die Ausführungsgeschwindigkeit dürfte bei C++ im Schnitt merklich schneller sein, als bei Java. Der Speicherverbrauch wird bei C++ unter Garantie deutlich unter dem von Java liegen.

Die Entwicklungsgeschwindigkeit wird allerdings oft höher mit Java sein! Allerdings gilt das nur für 08/15 Code. Denn wirklich schicke Algorithmen werden sich mit C++ fast immer schneller UND effizienter UND eleganter implementieren lassen.

Wenn du allerdings mit Bordmitteln nur ein Fenster auf den Bildschirm zaubern willst, indem du deine Gehaltsabrechnungen machen kannst, spricht nichts gegen Java. Im Gegenteil, hier wäre C++ mit entsprechend vielen Abhängigkeiten vielleicht sogar ein Overkill. (Für diese Aussage werden mich die Leute aus dem Qt-Lager vermöbeln wollen!)

Also um deine Frage letzendlich eindeutig beantworten zu wollen: Ja, C++ ist effizienter als Java. :)

Schönen Abend noch! ;)

PS: Java JIT-Compiler kann u. U. einige Branches der Ausführung besser optimieren als komplett optimierter C++ Code. Dieses Argument wird immer herangezogen, wenn gezeigt werden soll, dass Java "eben doch effizient" ist. Das stimmt zwar auch, allerdings sind die Codefragmente, in denen sich so eine JIT Optimierung bemerkbar macht, so dermaßen rar gesät, dass vernünftig durchdachter C++ Code trotzdem in den aller meisten Fällen vorne liegen wird! :)

Hallo, vielen vielen Dank für diese sehr ausführliche Antwort und auch die guten Erklärung jewals. Das ist eine wirklich einleuchtende und aufklärende Antwort. Aus dieser Antwort resultiert für mich, dass am besten kleinere Projekte, egal ob mit einer GUI oder nur als Consolen Anwendung, mit Java programmiert werden sollen, da dies viel unaufwendiger und unkomplizierter ist, durch bereits großen integrierten Standardlibraries, als wenn man es mit C++ realisieren möchte. C++ eignet sich für ehr größere Projekte, wie zum Beispiel 3D Games, wo es auch wirklich auf Performance an kommt. Unter dem Strich also, was auch andere empfohlen haben, werde ich mich mit beiden Programmiersprachen beschäftigen. Vielen Dank! :)

1

Ich versuche es mal kurz:

Ein perfekter Programmierer kann mit der sehr hardware-nahen Sprache c++  natürlich immer schneller sein!

ABER es gibt keine perfekten Programmierer und man hat nicht immer so viel Zeit um den Code extrem zu optimieren.

Wenn man jedoch mit Zahlen rechnet, die über 1 Mio. Stellen (egal ob mit oder ohne Komma) haben, kommt man um c++ nicht herum.

Unter http://www.gerdlamprecht.de/BisZuWelcherNKalleStringKombi.htm

habe ich mal unten in einer Tabelle die verschiedenen Sprachen verglichen.

BigAl (JAVA) ist zwar gegenüber c# sehr schnell und bis etwa 10000 Stellen recht praktikabel,

ABER ab 1 Mrd. Stellen nicht mehr machbar. Bei c++ kann man mit AVX-Befehle (256 Bit) und Multitasking, FFT-Multiplikation, RAM-Ptr... alles aus neuen CPUs herausholen!

Bei einer Sache nutze ich jedoch auch gern JAVA:

BigInteger nextProbablePrime()

dieser Befehl ist so gut optimiert und bis etwa 8000 Stellen schnell genug, dass ich dazu noch kein besseres c++ gefunden habe!

Bei Datenbanken ist nicht die Sprache, sondern die verwendete Technik entscheidend: (ADO, ODBC, .NET, API, Treiber...)

Und wenn ich mich nicht irre, werden selbst die gut optimierten JAVA-Teile (zumindest die JAVA-Treiber) selbst in C++ geschrieben.

Interessant werden Datenbankabfragen oberhalb 1 Mio. Datensätze, da hier der Zeitzuwachs nicht mehr linear, sondern nichtlinear ansteigt. Wenn ich z.B. in meinen 13 TB Pi Nachkommastellen suche, komme ich schneller zum Ergebnis, wenn ich mit c++ (und PureBasic) optimierten Programmen in 8 Festplatten und 50 Threads parallel suche, als wenn ich das in eine Datenbank stecke...

Bei JAVA gibt es übrigens auch echte Compiler:

https://de.wikipedia.org/wiki/Java_(Programmiersprache)

und so kann ein gut optimierte JAVA-EXE schneller als eine schlecht optimierte c++ EXE sein!

Der Vorteil von JAVA liegt jedoch in der universellen Anwendbarkeit des Codes auf verschiedenen Plattformen! Meine hoch optimierten c++ Programme laufen nur, wenn zig Bedingungen erfüllt sind: passendes Betriebssystem, 64 Bit, passende CPU mit AVX Befehlssatz... Selbst innerhalb der i7 Familie gibt es Unterschiede, weil Intel ständig was ändert!

Mit Java ist der Entwickler performanter als mit C++. Da Java stärkere Mechanismen zur Fehlervermeidung und zum sicheren Umgang mit Laufzeitfehlern hat, bekommt man damit rascher ein Programm zustande, das die geforderten Aufgaben erfüllt. Und da Java unabhängiger von der Plattform ist als C++, bekommt man das Programm rascher portiert.

All dies wird durch weniger Freiheit erkauft. Einge Dinge, die in C++ möglich sind, sind in Java nicht oder nur umständlich machbar.

Was möchtest Du wissen?