Ist C deutlich schneller als C ++ [geschlossen]

80

Soweit ich weiß, sind alle Skriptsprachen und wissenschaftlichen Kernprogramme normalerweise in C geschrieben. Dies macht die Implementierung chaotisch und doch direkt auf den Punkt.

Ich verstehe, dass diese Leute ihre Leistung maximieren möchten, aber gibt es einen echten Unterschied zwischen der Verwendung von C-Strings und C-Strukturen und der Verwendung von C ++ - Klassen? C ++ scheint auf die gleiche Weise zu funktionieren, abgesehen von virtuellen Funktionen, speichert es eine Klassenfunktion einmal und jede Instanz dieser Klasse ruft diese eine Funktion auf.

Was macht C schneller und ist es ein bemerkenswerter Unterschied in einem Projekt wie Python oder SQLite, die am schnellsten sein müssen?

Will03uk
quelle
8
"Sie sollten nur praktische, beantwortbare Fragen stellen, die auf tatsächlichen Problemen basieren, mit denen Sie konfrontiert sind." - Stackoverflow FAQ.
RedGrittyBrick
4
@ Will - Nein. "Ist eine Sprache schneller als eine andere Sprache" ist nicht zu beantworten. Sprachen sind nicht schnell, nur ihre Implementierungen. "Ist die X-Implementierung einer Sprache schneller als die Y-Implementierung einer anderen?" ist durch Profiling zu beantworten, aber was profilieren Sie? Sprachimplementierungen können in einer Vielzahl von Bereichen schnell oder langsam sein, und es ist zweifellos unmöglich, alle zu testen. Eine bessere Frage wäre: "Warum wählen Sprachdesigner X-Sprache anstelle von Y-Sprache?" Das hat eine klare Antwort (die von verschiedenen Sprachdesignern gegebenen Gründe) und ist eher hilfreich.
Chris Lutz
3
Der gleiche Code in C und C ++ sollte normalerweise mit genau der gleichen Geschwindigkeit ausgeführt werden, mit Ausnahme von Code, der aufgrund unterschiedlicher Aliasing-Regeln usw. eine andere Semantik aufweist. Der Unterschied besteht zwischen C-Idiomen und C ++ - Idiomen. Wenn Sie Code mit Best-Practice-C-Idiomen in C oder C ++ schreiben, ist dieser normalerweise viel leichter und schneller (und hat weniger Fehlerfälle zu behandeln) als ähnliche Funktionen, die mit Best-Practice-C ++ - Idiomen geschrieben wurden (unabhängig davon, ob Sie ihn schreiben) in C oder C ++), aber das Schreiben wird wahrscheinlich viel mehr Arbeit kosten.
R .. GitHub STOP HELPING ICE
7
C ist in seiner Gesamtheit deutlich schneller zu lernen als C ++;)
Fredoverflow
2
@Gracchus Wir sprechen hier über zwei verschiedene Dinge. Das Ausführen allgemeiner Aufgaben ist in C ++ dank Standardcontainern und RAII und so weiter viel einfacher. Ich sage nur, dass die Sprache selbst so viel größer als C ist. Wenn Ihr Ziel darin besteht, C ++ in seiner Gesamtheit so weit zu lernen, dass Sie beliebige C ++ - Programme, die von jemand anderem geschrieben wurden, nehmen und verstehen können, dauert es mehrere Jahre (ungefähr) 10 nach vielen) des Lernens von C ++. Auf der anderen Seite dauert es vielleicht ein paar Wochen oder Monate, bis man alle Feinheiten von C gelernt hat, weil es in C einfach nicht so viel Sprachkomplexität gibt
Fredoverflow

Antworten:

62

C ++ wird häufig für wissenschaftliche Programme verwendet. Die Popularität von C kann in diesem Bereich nachlassen. Fortran bleibt als "Low-Level" -Sprache beliebt.

In C ++ "zahlen Sie nur für das, was Sie verwenden." Es gibt also nichts, was es langsamer als C machen würde. Insbesondere für wissenschaftliche Programme ermöglichen Ausdrucksvorlagen die Durchführung einer benutzerdefinierten Optimierung mithilfe der Vorlagen-Engine zur Verarbeitung der Programmsemantik.

Der Grund, warum C für Projekte wie Python gewählt wird, ist, dass viele Leute es (relativ) vollständig verstehen, sodass eine große Codebasis viele große Mitwirkende nicht verwirrt.

SQLite erfordert eine kleine Größe des ausführbaren Codes, wobei C eine leichte Kante hat. Die umsichtige Verwendung von C ++ ermöglicht weiterhin die Verwendung in eingebetteten Anwendungen, ist jedoch weniger beliebt, da befürchtet wird, dass sich unerwünschte Sprachfunktionen einschleichen.

Kartoffelklatsche
quelle
9
Beachten Sie, dass C ++ Mangeln benennt, während C dies nicht tut. Dies erleichtert anderen Sprachen die direkte Verbindung mit C. (swig erstellt tatsächlich eine C-Schnittstelle zu C ++ - Code für Sie, bevor Sie den Python-Wrapper für die C ++ - Bibliothek erstellen.)
Sam P
7
@SamP C ++ verfügt über eine Funktion zum Deaktivieren der Namensverwaltung extern "C". Swig verwendet C zufällig als Verkehrssprache, aber Sie können diesen Wrapper in der C-kompatiblen Teilmenge von C ++ implementieren und niemals einen C-Compiler aufrufen.
Potatoswatter
26

Ich denke nicht, dass der Grund so sehr mit der Leistung als mit der Interoperabilität zusammenhängt. Die C ++ - Sprache ist komplexer als die C-Sprache, aber unter Leistungsgesichtspunkten sollte es in keiner Weise einen nennenswerten Unterschied geben. Einige C ++ - Konstrukte sind schneller als das C-Äquivalent ( std::sortist schneller als qsort) und es gibt wahrscheinlich gute Beispiele für die Umkehrung.

EDIT: Auf der Interoperabilitätsseite ...

Grundsätzlich definiert der C ++ - Standard einige der Dinge nicht, die für eine einfache Interoperabilität zwischen Binärdateien erforderlich sein könnten, die mit verschiedenen Compilern / Versionen erstellt wurden. Das bemerkenswerteste Problem hierbei wäre die Namenskonvention für die Symbole in der Binärdatei. In C definiert die Sprache eine einzelne Zuordnung von jedem Symbol im Code zum binären Symbolnamen. Eine aufgerufene Funktion my_functionerstellt ein Symbol in der aufgerufenen Binärdatei my_function. Andererseits und aufgrund von Funktionen wie Funktionsüberladung müssen die Namen von C ++ - Funktionen entstellt werden(übersetzt in verschiedene Funktionssymbole in der Binärdatei, die die Typen der Argumente und Rückgabetypen codieren), und der Standard definiert nicht, wie das Mangeln durchgeführt wird. Dies bedeutet wiederum, dass dieselbe Funktion in C ++ je nach Compiler zu unterschiedlichen Symbolen kompiliert werden kann (es extern "C"sei denn, dies wird verwendet, um die C-Interoperabilität für diese Funktionen in C ++ zu erzwingen).

Letztendlich müsste die Schnittstelle zwischen der Skriptsprache und dem nativen Code ohnehin eine C-Schnittstelle sein, selbst wenn die Details der internen Implementierung C / C ++ / jede andere Muttersprache sein könnten.

(Ich möchte absichtlich nicht in einen Flammenkrieg der Sprachpräferenzen eintreten. C ++ ist wirklich mächtig, aber es ist auch ein bisschen beängstigend, da es eine viel komplexere Sprache als C ist und einige Dinge, die einfach aussehen, Auswirkungen haben könnten Performance)

David Rodríguez - Dribeas
quelle
1
Ich denke, man kann mit Sicherheit sagen, dass modernes, idiomatisches C ++ einen intelligenten Compiler erfordert, um Inlining, RVO, ständiges Falten usw. voll ausnutzen zu können. Damit ist es durchaus möglich, dass schwergewichtige C ++ - Konstruktionen überhaupt nicht wahrnehmbar sind Maschinenebene, aber ein guter Compiler ist für C ++ weitaus wichtiger als für C.
Kerrek SB
@ Kerrek SB: Die meisten modernen C ++ - Compiler (wo modern in den letzten Jahren bedeutet) sind wirklich gut darin, idiomatische C ++ - Konstrukte zu identifizieren und zu optimieren. Dies std::sortist ein Beispiel: Der std::lessstandardmäßig verwendete Funktor ist nicht weniger effizient als die entsprechende C-Funktion, aber alle mir bekannten Compiler werden ihn inline (als Vorlage, die zum Inlining verfügbar ist) und alle Funktionsaufrufe an den compareFunktor entfernen .
David Rodríguez - Dribeas
Witzigerweise ist die EASTL- Bibliothek von Electronic Arts teilweise durch die Behauptung gerechtfertigt, dass GCC beim Inlining schlecht ist (und MSVC viel besser) und dass die Standardbibliothek daher zu viele nicht optimierte Funktionsaufrufe verursachen würde. In EASTL verwenden sie weniger Indirektionen, um dies zu bekämpfen. Wer weiß, wie gut diese Argumentation heutzutage hält.
Kerrek SB
11

Wie Bjarne in [D & E] erwähnt hat, ist die Effektivität eines der Hauptziele von C ++. Daher ist C ++ nur dann langsamer, wenn der Programmierer seine "zusätzlichen" Funktionen wie die von Ihnen erwähnten virtuellen Funktionen, Rtt-Informationen usw. Verwendet

Ich denke, es sind eher psychologische Gründe - C wird verwendet, da es keine "langsamen" C ++ - Funktionen zulässt.

outmind
quelle
9

Sprachen sind von Natur aus nicht schneller oder langsamer, Interpreter und Compiler sind möglicherweise mehr oder weniger effizient.

Darüber hinaus bieten übergeordnete Sprachen Abstraktionsschichten, die normalerweise Laufzeitkosten verursachen. Wenn Sie sie nicht verwenden, ist der Compiler möglicherweise intelligent genug, um sie zu entfernen. Dies ist jedoch möglicherweise nicht möglich, wenn die Semantik der Sprache dies nicht sicher zulässt. Und wenn Sie sie benötigen, implementieren Sie sie selbst In einer niedrigeren Sprache ist die Sprache wahrscheinlich langsamer als in der "langsamen" Sprache.

fortran
quelle
24
Skriptsprachen sind von
Natur aus
2
@ Will03uk - Was hält Sie davon ab, einen Compiler für eine normalerweise geskriptete Sprache zu schreiben?
Chris Lutz
5
@ Chris dann wäre es keine Skriptsprache; Die Auswirkungen einer Skriptsprache sind, dass sie interpretiert oder Bytecode kompiliert wird. Sobald Sie es kompiliert haben, ist es nicht eine kompilierte Sprache
Will03uk
1
Dies ist nicht die ganze Wahrheit: Die Sprachsemantik spielt eine Rolle, da sie die Informationen bestimmt, die dem Optimierer zur Verfügung stehen, und welche Annahmen sicher getroffen werden können, ohne dass eine Analyse des gesamten Programms durchgeführt werden muss. Ein restricttypisches Beispiel : Das Schlüsselwort in C oder Luajit - letzteres bläst nicht jedes andere VM für dynamische Sprachen aus dem Wasser, nur weil Mike ein kluger Kerl ist, sondern auch, weil Luas Semantik ziemlich sauber ist (im Vergleich zu zB JavaScript).
Christoph
1
@Christoph Was ich damit sagen will ist, dass es keine Silberkugel gibt. Wenn Sie Dinge wie dynamisches Versenden, virtuelle Anrufe, heißes Laden von Code oder Entenschreiben benötigen, ist eine Sprache, die "langsam" erscheint,
wenn sie sofort einsatzbereit