C++ Performance von C++ - aktueller Stand?

pizza4ever

Lt. Commander
Registriert
Apr. 2009
Beiträge
1.734
Guten Tag,

bisher schreibe ich eig immer alles in C++ ... ich habe bisher keien Vorteil darin gesehen, meine Codes auf C# oder auf Java zu portieren bzw. neue Programme NICHT in C++ zu schreiben. Außerdem habe ich die Erfahrung gemacht, dass es praktisch alle Bibliotheken direkt für C/C++ gibt während sie für andere Programmiersprachen nur über Wrapper verfügbar sind.

Allerdings ist mein subjektiver Eindruck aus dem Lesen diverser Berichte immer mehr, dass man bei unsauberem Code leichter "langsamen Code" als z.B. in C# erzeugt wird. Ich les halt oft sowas wie: "jaa wir ham zwei Programmierteams, die eine hams in C# und die anderen in C++ gemacht, C# war besser."
Dann heißt es immer: Der C++ Code muss optimiert werden. Aber man muss ja auch bedenken, dass die Codes ja unter ähnlichen Bedingungen entstanden sind und idR gerade bei größeren Programmierteams es immer einen guten und einen schlechten Programmierer geben wird.
Anders gesagt, wie sieht es in praktischen Anwendungen aus, ist C# dort vielleicht doch C/C++ überelegen? Dass unter Laborbedingungen C++ zu 99% schneller ist, ist ja klar.
Selbst auf Wikipedia steht ja bei C++:
http://de.wikipedia.org/wiki/C++#Entstehung_und_Weiterentwicklung
"Die vorhandenen Performance-Probleme der Sprache C++, die Rechenzeit und Speicherplatz betreffen, werden auf hohem Niveau zusammen mit Lösungen im Technical Report ISO/IEC TR 18015:2006 diskutiert. Das Dokument ist zum Download von ISO freigegeben."
Was sich für mich irgendwie nicht soo überzeugend liest, allerdings weiß ich nicht genau, was damit gemeint ist. Dass es natürlich nochmal Compiler- und Codeabhängig ist (s.o.) ist mir schon klar...

Was ist eure Meinung? So richtig umfassende Vergleiche habe ich leider nicht gefunden.
 
erstens ist das keine frage von c++ vs X, sondern eine frage der compiler die verwendet werden. nimmst du den microsoft compiler für c++ wirst du den langsamsten c++ code unter den gängigen compilern bekommen. da MS mehr an C# bastelt würde es mich nicht wundern, wenn C++ mit MS C++ compiliert mittlerweile langsamer ist als C# mit MS C# kompiliert.

darüber hinaus sind die implementierungen der verwendeten bibliotheken noch ein faktor.

also einfach: deine frage ist so sinnlos (nicht als beleidigung gemeint).
 
Bei allen DotNet-Sprachen ist es so, dass sie bei der Ausführungsgeschwindigkeit fast so schnell sind wie normale C++-Anwendungen.
Kompiliert wird DotNet-Code immer in IL-Code, der dann zur Laufzeit in echten Maschinencode umgewandelt wird.
Bei CSharp hat man gegenüber C++ aber die Vorteile, dass man weniger kritische Fehler in den Code hauen kann, weil DotNet z.B. das Speichermanagement übernimmt, es also wesentlich schwieriger ist BufferOverflows in den Code zu hacken.
Außerdem muss man sich generell über viele Dinge keine Gedanken machen, weil das die DotNet-Umgebung für einen macht.
 
Also C++ ist als "besseres" C verwendet, wahrscheinlich geschwindigkeitstechnisch unschlagbar.
Sollten aber so Sachen wie dynamic_cast und RTTI oder die Standard-Container verwendet werden, kann es schnell "langsam" werden.

Aber wann ist eine Sprache "gut". Ich greif mal dein Zitat auf: M.W. gibt es in C# keine richtigen Pointer, damit ist es mal aus Prinzip weniger fehleranfällig für geschrottete Pointer. Aber ob es schneller ist?
(Wird C# nicht vom MS-IL Compiler zur Laufzeit übersetzt?)

EDIT: War wohl ein bisschen langsam.
Zu DotNet: Da kannste halt nicht elegant unleserlichen Code schreiben, der richtig schön hardwareabhängig ist.
Und .NET recht und gut, aber machmal braucht mal halt direkten Zugriff auf Funktionen der WinAPI und da hat man das gegurke, bis man ein String^ nach char* oder so bekommt.
Und man darf auch nicht vergessen, das in Echtzeitanwendungen .Net paar Probleme hat (Garbage-Collecting).
 
Zuletzt bearbeitet:
Das hat jetzt zwar nicht direkt etwas mit der Performance von C++ zu tun, aber ich denke das es doch recht passend ist.
Wenn man ein bissl was von Software Engineering und Projektplanung versteht sollten probleme wie "Guter und schlechter" Programmierer gar nicht existieren, denn dann gibt es eine ausführliche Spezifikation, Use Cases, UML's etc. Schlechter code entshet i.d.r. nur durch Code & Fix. Also munter druff los, testen, erweitern, testen, ändern...........
Da weiß später keiner mehr was sache ist.
Code Optimieren ist ja an sich immer eine gute sache und in c++ bestimmt besser möglich als in Java und C#, denn diese laufen ja auf einer VM was dir selber nur bedingte Optimierungsmöglichkeiten gibt. Wobei man bei C# ja durch "unsafe" Methoden auch direkt auf den Speicher zugreifen kann.
Ich persönlich habe damals auch in C++ geschrieben, hab mir dann C# angeschaut und bin dann gaaaanz schnell auf Java umgestiegen. Die Java Performance ist heute recht gut, du hast gleich richtige OS Unabhänigkeit, bzw. kannst sie um einiges leichter umsetzen und Java ist meiner meinung nach die "Komfortabelste" Sprache ;)
Wenn man nicht gerade Zeitkritische Anwenungen schreiben muss bin ich nicht mal sicher ob man da groß nen Unterschied merkt.
Ansonsten würde ich mich bereit erklären das wir mal nen Benchmark erstellen, sprich ein Programm in den 3 Sprachen erstellen und die Performance vergleichen. Würde mich nämlich auch Interessieren !
 
Aus Wikipedia:
Einige der Elemente von C++, die im Allgemeinen als unsicher gelten, wie beispielsweise Zeiger, werden in C# nur für sogenannten „unsicheren Code“ erlaubt, der in Zonen mit eingeschränkten Rechten (z. B. bei Programmen, die aus Webseiten heraus ausgeführt werden) ohne die Zuteilung erweiterter Rechte nicht ausgeführt wird.

Es ist wohl nicht so üblich welche zu verwenden. Das mit dem MS Compiler mag stimmen aber dann gibts ja noch den Gcc und den Intel Compiler. Aber bei sowas ists auch so dass mich nicht unbedingt die theoretische Leistung (wenn es einen guten gäbe, wäre C++ besser) interessiert, sondern das was praktisch möglich ist.

Ich nutze übrigens C/C++ und für Oberflächen QT. DotNET habe ich bisher kaum verwendet.


@Mercsen: Mich würds auch mal interessieren, ich würde den C++ Teil dann übernehmen ;)
 
Hängt auch vom Compiler ab,
wenn du einen Intel C/C++ Compiler verwendest, ist der Code z.Z. 3-5 mal schneller als mit msvs. und auch mingw erzeugt schnelleren code als visual studio.
wenn du ne konsolenanwendung/makefile verwendest, dann ist c++ auch bei microsoft deutlich schneller als c#, da es sich dann um maschinencode und nicht um il handelt
 
Hi,

bin C#-Entwickler. Hätte auch Interesse an einem Vergleich. Allerdings nur wenn es nicht zu viel Aufwand wird, hab jeeeeede Menge zu tun Momentan :)

An was hattet ihr denn gedacht als Benchmark?

VG,
Mad
 
Ich würd dann den Java teil machen ^^
Ambesten vergleichen könnte man ja z.b. die performance beim einlesen von Datein, den speicher vollladen und komplett auslesen, evtl. Threads, denn die können wenn falsch implementiert ne ganz schöne bremse sein. Müsste man sich mal genauer mit beschäftigen, muss nur leider gleich zur Arbeit aber wenn ihr da Ideen habt lasst sie mich gerne wissen ;)
Hab zwar auch gerade nen Mega Projekt am Hals was ich neben meiner normalen Arbeit machen muss aber für sowas würd ich mir zeit nehmen :D
 
Joa sowas könnte man machen, wobei ich noch irgendwie nen paar arithmetische Operation zwischendurch durchführen würde...

und natürlich OOP, sonst machts ja keinen sinn;) wobei ich je nach aufgabenstellung auch noch ne prozeduale Version erstellen würde (zu vergleichszwecken) Wenns da viel zu Rechnen gäbe würde ich die Berechnung aus Spaß auch nochmal auf CUDA auslagerrn da könnte man dann evtl. nochmal sehen wie langsam unsere CPUs bei parallelen Berechnungen sind ;)
 
Heutige PCs sind doch für 99,9999% aller Software eh schnell genug.
Die viel wichtigere Frage als nach der Performance ist doch:
Wie lange dauert die Entwicklung bis in einen Verkaufsfertigen Zustand? und
Wie einfach kann die Software anschließend gewartet werden? Insbesondere von Leuten, die nicht an der ursprünglichen Entwicklung beteiligt waren.
In diesen beiden Punkten werden moderne Sprachen wie C# oder Java besser abschneiden als C++ (sofern nicht eine Bib fehlt, die es nur für C++ gibt)

Wenns um reine Performance geht kommt es immer speziell auf den Fall und die Anwendung an - gibt Benchmarks wo Java gewinnt (Stichwort: Just-In-Time-Compiler) und viele wo C++ vorne liegt (direktere Speichernutzung). Ich hab auch mal was C++ vs C# gesehen wo C++ immer noch deutlich vorne lag.

C/C++ wird vor allem in echtzeitkritischen Anwendungen (Spiele, Betriebssysteme, Bildverarbeitung und Bildbearbeitung, Robotik, KI, ...) und in Hardwarenahen Umgebungen eingesetzt. (Mirkocontroller, Nicht-PC Plattformen wie EBS, Handys, ...). Dort muss man die Nachteile der Sprache halt in Kauf nehmen.
Solange Laufzeit nicht so wichtig ist und man die Wahl hat ist C#/Java aber sicher eine mindestens genau so gute Wahl.
Ne andere Frage ist natürlich auch wieder das OS! .Net kommt ja für unkompliziertes Cross-Plattform kaum in Frage.. C++ aber auch nur bedingt.

Bei viel eingesetzter PC-Software in der keine komplexen Berechnungen stattfinden ist der Flaschenhals eh eher sowas wie ne Datenbank die >1000 Mitarbeiter gleichzeitig nutzen
 
Zuletzt bearbeitet:
Ich versteh nicht so recht warum viele Programmierer so Performance-fixiert sind. Für die meisten Anwendungen spielt die Ausführungsgeschwindigkeit eine eher untergeordnete Rolle. Viel wichtiger ist oft Stabilität, Wartbarkeit etc.

Welche Sprache man dafür benutzt ist zweitrangig. Wer C++ beherrscht kann damit schnelle und wartbare Programme schreiben. Wer es nicht beherrscht schreibt genau das Gegenteil. ;)
Der Vorteil von managed Sprachen wie C# und Java ist eben, dass man zwar weniger Spielraum für Optimierungen hat, aber eben auch weniger "Unsinn" manchen kann (automatische Speicherverwaltung, keine Pointer).

Was du benutzen willst musst du selbst entscheiden. Nur anhand Performance solltest du aber nicht entscheiden, weil die eben vor allem vom Programmierer abhängt.
 
Ja, aber die Frage ist:

Lohnt es sich von C++ weg zu gehen? Die Gründe die mich bisher eben an C++ haben festhalten lassen sind:
Bibliotheken
Performance.

Und ja, ich schreibe zeitkritische Anwendungen, was aber einfach in der Natur der Sache liegt. Wenn nun aber das Performance Argument wegfällt, hätte man ein Argument weniger um dazubleiben und könnte es nur noch von den Bibs abhängig machen
 
Das Problem ist, dass dir hier keiner sagen kann wie sich deine Anwendungen unter C# oder Java verhalten werden. Auch mit managed Sprachen kann man schlechten unperformanten Code schreiben.
Anderes gesagt: Wenn du mit der Performance und der Wartbarkeit von C++ zufrieden bist sehe ich keine Grund warum du wechseln solltest.
 
Dese schrieb:
erstens ist das keine frage von c++ vs X, sondern eine frage der compiler die verwendet werden. nimmst du den microsoft compiler für c++ wirst du den langsamsten c++ code unter den gängigen compilern bekommen.

Das glaube ich nicht. VC 6.0 war absoluter Schrott. Aber seit VC 2008 muß sich Microsoft's C++-Compiler eigentlich vor niemandem mehr verstecken.
Ergänzung ()

Blitzmerker schrieb:
Also C++ ist als "besseres" C verwendet, wahrscheinlich geschwindigkeitstechnisch unschlagbar.
Sollten aber so Sachen wie dynamic_cast und RTTI oder die Standard-Container verwendet werden, kann es schnell "langsam" werden.


dynamic_cast und RTTI, da stimme ich dir zu (wobei man die bei anständigem Design eigentlich so wie so nicht brauchen sollte). Aber deine ablehnende Haltung gegenüber den Standardcontainern kann ich so ganz und gar nicht teilen. Ich würde mal sagen, daß die Standardcontainer in 90% der Fälle weitaus performanter sind, als alle vergleichbaren selbstgebastelten Container, und in den 10% wo das nicht stimmt, macht die Differenz wahrscheinlich nur in einem Zehntel der Fälle einen signifikanten Unterschied für die Anwendung.

Des weiteren muß ich denen Recht geben, die sagen, daß heute viel zu viele Programmierer vom Optimierungswahn besessen sind. Schreibt eure Programme mit den sinnvollsten Strukturen und Algorithmen. Dann testet sie. Wenn ihr meint, die Anwendung sei zu langsam, schnappt euch einen Profiler und findet genau raus, WO die meiste Zeit verbraten wird. Dann könnt ihr darüber nachdenken, was man tun könnte, um an genau diesen Stellen gezielt mehr Effizienz rauszukitzeln. Also zum Mitmeißeln: Erst Profilen, DANN Sorgen über Performance machen. Alles andere ist Schwachsinn.

Zu mal für die meisten Anwendungen sogar vergleichbar 'schneckenlahme' Programmiersprachen wie Python absolut ausreichend sind und im Übrigen auch die schnellste Programmiersprache absolut grottenlangsame Programme ergeben kann, wenn man die falschen Algorithmen oder Datenstrukturen wählt.
 
Zuletzt bearbeitet:
Ich werf mal den Faktor Entwicklungszeit in den Raum.

Bin der Meinung das man meist mit C# / Java schneller am Ziel ist als mit C++.
Wie der vorredner schon treffend formuliert hat Performance ist fast immer wurscht wir leben in einem Zeitalter wo eine billig CPU genug performance für alle normalen anwendungsfälle hat.
 
Najaa, das stimmt so nicht. Sonst gäbs ja kein CUDA o.ä. Natürlich, für das normale Windows Programm ist die Performance nicht wichtig, aber es gibt sehr viele Bereiche in denen Geschwindigkeit noch immer eine sehr große Rolle spielt. Nehmen wir als Beispiel z.b. mal die ganzen neuen Entwicklungen im Bereich der Fußgängererkennung etc. Da gabs doch auch letztens ein Auto, was durch Braunschweig alleine gefahren ist (VW Testfahrzeug) Sowas wäre kaum möglich, wenn eine rote Ampel erst 10 sec. später erkannt worden wäre.
 
Was bei der Diskussion erwähnt werde sollte:

- Java ist eigentlich nicht plattform-unabhängig sondern selbst eine Plattform
- Der Java Compiler ist in C++ programmiert, warum wohl?
- Der C# Compiler ist in C++ programmiert
- C# benötigt .net oder Mono. Dort es beides nicht gibt, läuft es nicht.

Die Vorteile von C++ liegen imo in den Möglichkeiten die die Sprache bietet. Sie unterstützt ziemlich alle Programmierparadigma inklusive Generische Programmierung bei den der Template-Mechanismus als funktionale Programmiersprache funktiert, welche der C++ Compiler zur Compile-Zeit ausführt. Mit etwas Selbst-Disziplin und Erfahrung bekommt man vieles schnell programmiert.
 
Zurück
Oben