Frage von Felix193, 79

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

Hallo,

durch die große Ähnlichkeit der Syntax beider Sprachen, beschäftige ich mich seit kurzem auch mit C++. Nun stellen sich für mich die Frage, in welchen Bereichen C++ bzw. Java performanter ist, und um welchen Faktor.

• Scheduled repeating Tasks (alle 200 ms)

• komplexe Berechnungen (mit int, short, float, double, long, unsigned etc)

• Verwendung von vielen Variablen, Arrays bzw Maps (Strings, ArrayList, HashMap etc)

• Zugriff auf Datenbanken

• 2D & 3D Spiele

• (allgemein) Multi Core & Multi Threading

Je nach Ergebnis werde ich eine Sprache intensiver benutzen. Vielen Dank für Antworten.

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von TeeTier, 25

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! :)

Kommentar von Felix193 ,

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! :)

Antwort
von hypergerd, 9

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!

Antwort
von emem1234, 34

Da c/c++ direkt in Maschinencode compiliert wird ist es in so gut allen Belangen sicherlich performanter. Daher werden systemnahe Programme weiterhin in c/c++ geschrieben.

Die Java Compiler und VMs sind mittlereweile aber schon sehr gut in der Optimierung. Java hat seinen Siegeszug als Programmiersprache im Enterprise Application Umfeld. Es haben sich im Laufe der Zeit viele unterschiedliche Frameworks und Container Technologien entwickelt. Als Anwendungsentwickler verwendet man Java eigentlich nur noch als "Kleber" zwischen den Frameworks.

Ich würde mich, wenn ich Entwickler werden möchte eigentlich mit beiden auseinandersetzen und wenigstens den kompletten Sprachumfang beherrschen.

Schaut man sich im github um, wird man feststellen, dass eigentlich "go" gerade ganz groß im kommen ist.

Kommentar von Felix193 ,

Okay, danke. Mir war bereits klar, dass Java erst das Programm in einen bytecode compiliert. Daher müsste es langsamer sein. Aber ich war etwas verwundert, da teilweise auch gegenreiliges behauptet wurde, dementsprechend dass C++ langsamer sei. Dann werde ich wahrscheinlich erstmal mit beidem arbeiten. Die Syntax sind ja glücklicherweise wirklich sehr ähnlich, sodass es eine relativ einfache Kombination ist.

Antwort
von tDoni, 24

Beide Sprachen haben Vor- und Nachteile. Für C/C++ spricht natürlich die Hardware-Nähe. Java dagegen ist Platformunabhängig, beliebt im Enterprice Sektor und kommt bei Android zum Einsatz.

Der Java Compiler und die JVM leisten inzwischen auch sehr gute Arbeit, da der Bytecode jedes mal für die aktuell genutzte CPU Optimiert ausgeführt werden kann.

der JIT Java Compiler, der in manchen Fällen schneller als C++ ist, da 
er sich bei jedem Start auf die CPU Art anpasst und C++ nur eine
allgemeine Lösung bietet

(von https://www.it-talents.de/cms/blog/it-talents/c-vs-java)

Wenn es dir aber wirklich auf die Geschwindigkeit ankommt, solltest du trotzdem zu hardwarenäheren Sprachen greifen. Da landest du dann wieder bei C/C++

Selbst Go soll bei verschiedenen Benchmarks gar nicht so gut abschneiden, da bin ich aber gerade nicht ganz auf dem Aktuellstem Stand.

Kommentar von Felix193 ,

vielen Dank für diese ausführliche Antwort. Aus anderen Antworten ist jetzt das Resultat hervorgekommen, dass ich am besten beide Sprache verwenden solle, eben wegen den Vor- und Nachteilen... Für ein Spiel werde ich dann wahrscheinlich C++ verwenden, weil es dabei nun um die Leistung geht...

Kommentar von tDoni ,

Also meine Meinung dazu ist sowieso, es kann nicht schaden, mehrere und verschiedene Programmiersprachen zu kennen/kennenzulernen, da jede Sprache verschiedene Anwendungsgebiete und Vor- & Nachteile hat.

Für ein Spiel wäre wohl auch C++ mein Favorit. Da könntest du dir aber auch die Unity Spiele Engine ansehen. Da wäre wohl C# das Mittel der Wahl.

Kommentar von Marbuel ,

Als ob du ein AAA-Game entwickeln würdest, wofür du C++ brauchen würdest. Für das, was einer privat hobbymäßig als Game zusammenschustert, reicht Java oder C# fünfmal. :-)

Kommentar von tDoni ,

Damit hast du eigentlich auch recht ;)

Antwort
von Franz1957, 12

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.

Antwort
von LeonardM, 12

In Schnelligkeit undssparsamkeit gewinnt C und danach c++ und als letztes java

Kommentar von TeeTier ,

Die ersten beiden Plätze sollten vertauscht werden, da C++ dem Entwickler viel mehr Mittel in die Hand gibt, um dem Compiler zu sagen, was die eigentliche Intention des Quelltextes ist. Der Compiler kann so aus C++ besseren Maschinencode erzeugen, als es bei C möglich wäre.

Die einzige Ausnahme dürfte das "restrict" Schlüsselwort von C sein, mit dessen Hilfe man C Quelltext annähernd so schnell machen kann, wie FORTRAN-Code. (Stichwort "Pointer-Aliasing")

Allerdings ist mir kein Compilerhersteller bekannt, der NICHT auch eine ähnliche Funktion für C++ anbieten würde. (das ist dann aber leider nicht mehr allzu portabel, es sei denn man wagt sich in die Makrohölle)

Dass Java den letzten Platz belegen dürfte, darin sind wir uns aber einig. :)

Kommentar von LeonardM ,

Naja ich glaube das es keinen grossen unterschied gibt zwischen den beiden ersten sprachen was schnelligkeit und sparsamkeit betrifft. Ansonsten hätte linus sicherlich schon länger mit seinem "team" den kernel in cpp geschrieben. Ich persönlich bevorzuge ebenfalls cpp aber hätte jetzt mal so gesagt c wäre nen tick besser :D

Antwort
von androhecker, 25

So kann man das nicht sagen, jedes Programm ist anders. (Auf die Bereiche bezogen)

Aber C++ ist auf jeden Fall schneller, in den meisten Benchmarks (klar, so aussagekräftig sind die nicht) so um den Faktor 2-3mal.

Da muss man eben Abwiegen, C++ ist zwar schneller, aber lange nicht so plattformunabhängig, etc. Man kann nicht sagen, dass C++ schneller ist und deswegen nutzt man immer C++, sonst würde wohl jeder heute Assembler nutzen.

Kommentar von Felix193 ,

Okay, danke. Mir war bereits klar, dass Java erst das Programm in einen bytecode compiliert. Daher müsste es langsamer sein. Aber ich war etwas verwundert, da teilweise auch gegenreiliges behauptet wurde, dementsprechend dass C++ langsamer sei. Auch aus der Antwort sich das Resultat, dass ich am besten mit beiden mich beschäftigen sollte, da beide ihre Vorteile haben.

Kommentar von androhecker ,

C++ ist eben auf einem niedrigeren Level als Java (aber immer noch eine Hochsprache), damit kann man, richtig eingesetzt, immer schnellere Programme erreichen.

Expertenantwort
von Marbuel, Community-Experte für Computer, 26

C++ sollte immer performanter sein, da nicht erst in Zwischencode kompiliert. Außerdem kann man das Speichermanagement hinsichtlich der Anforderungen optimieren. Bei Java ist das ja automatisiert. Die Frage ist immer nur, ob man wirklich darauf angewiesen ist. Und da lautet nicht nur im privaten Bereich die Antwort wohl meistens nein.

Kommentar von Felix193 ,

Okay, danke. Mir war bereits klar, dass Java erst das Programm in einen bytecode compiliert. Daher müsste es langsamer sein. Aber ich war etwas verwundert, da teilweise auch gegenreiliges behauptet wurde, dementsprechend dass C++ langsamer sei. Dann werde ich es mir nochmals überlegen. Ansich gefällt mir eigentlich Java mehr, aber die Systemnahheit von C++ ist der Knackpunkt.

Antwort
von SeriousLaw, 2

Java ist so gut weil es in C/C++ entwickelt wurde. Natürlich ist eine Nativ übersetzte Programmiersprache viel schneller als Java. Dies ist aber nicht immer von Vorteil, da du dich um das Speichermanagement von dem Heap selber kümmern musst und es keinenn Garbaga Collecter gibt. Dies macht die Programmierung sehr aufwändig und fehleranfällig.

Es gibt da so einen netten Spruch:

C++ My compiler compiles your compiler.

Die meisten Compiler werden mit C/C++ und Assembler gebaut.

Antwort
von Omnivore11, 18

Natürlich ist C++ performanter. Schließlich wird der Kode direkt kompeliert und gelinkt.

Keine passende Antwort gefunden?

Fragen Sie die Community