Ist C deutlich schneller als C++ [closed]

Lesezeit: 8 Minuten

Soweit ich weiß, sind alle Skriptsprachen und wissenschaftlichen Kernprogramme normalerweise in C geschrieben; dies macht die Implementierung chaotisch, aber in gewisser Weise direkt auf den Punkt.

Ich verstehe, dass diese Leute ihre Leistung maximieren möchten, aber gibt es einen wirklichen 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, es speichert 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, wer am schnellsten sein muss?

  • „Gut geschriebener Code in jeder Sprache ist immer besser als schlecht geschriebener Code in irgendeiner anderen Sprache.“

    – Kerrek SB

    5. August 2011 um 10:54 Uhr

  • Viele dieser Projekte begannen, bevor C++ allgemein akzeptiert und in einem geeigneten Zustand war. Trägheit hält Leute davon ab, C zu verwenden.

    – David Heffernan

    5. August 2011 um 10:55 Uhr

  • @ 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, sie alle zu testen. Eine bessere Frage wäre: “Warum wählen Sprachdesigner die X-Sprache anstelle der Y-Sprache?” Das hat eine klare Antwort (die Begründungen verschiedener Sprachdesigner) und ist eher hilfreich.

    – Chris Lutz

    5. August 2011 um 11:01 Uhr

  • Derselbe Code in C und C++ sollte normalerweise mit genau der gleichen Geschwindigkeit ausgeführt werden, mit Ausnahme von Code mit unterschiedlicher Semantik aufgrund unterschiedlicher Aliasing-Regeln usw. Der Unterschied besteht zwischen C-Idiomen und C++-Idiomen. Wenn Sie Code mit bewährten C-Idiomen in C oder C++ schreiben, ist er normalerweise viel leichter und schneller (und es müssen weniger Fehlerfälle behandelt werden) als ähnliche Funktionen, die mit bewährten C++-Idiomen geschrieben wurden (unabhängig davon, ob Sie ihn schreiben). in C oder C++), aber das Schreiben wird wahrscheinlich viel mehr Arbeit erfordern.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    5. August 2011 um 11:06 Uhr

  • C ist in seiner Gesamtheit deutlich schneller zu lernen als C++ 😉

    – fredoverflow

    5. August 2011 um 13:19 Uhr

Benutzeravatar von Potatoswatter
Kartoffelklatsche

C++ wird oft für wissenschaftliche Programme verwendet. Die Popularität von C könnte in diesem Bereich nachlassen. Fortran bleibt als “Low-Level”-Sprache beliebt.

In C++ „zahlst du nur für das, was du nutzt“. Es gibt also nichts, was es langsamer als C machen würde. Insbesondere für wissenschaftliche Programme ermöglichen Ausdrucksvorlagen eine benutzerdefinierte Optimierung unter Verwendung der Vorlagen-Engine zur Verarbeitung der Programmsemantik.

Der Grund, warum C für Projekte wie Python bevorzugt wird, ist, dass es weniger verwirrend zu lesen ist, sodass eine große Codebasis für einen größeren Pool von Mitwirkenden leichter zugänglich ist.

SQLite hat eine Anforderung für eine kleine Größe des ausführbaren Codes, wobei C einen leichten Vorteil hat. Die vernünftige Verwendung von C++ erlaubt immer noch die Verwendung in eingebetteten Anwendungen, aber es ist weniger beliebt, da befürchtet wird, dass sich unerwünschte Sprachfunktionen einschleichen.

  • Beachten Sie, dass C++ im Gegensatz zu C die Namensverfälschung durchführt, was es für andere Sprachen einfacher macht, direkt mit C zu kommunizieren. (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

    8. September 2015 um 18:16 Uhr

  • @SamP C++ hat eine Funktion zum Deaktivieren der Namensverfälschung, extern "C". Swig verwendet C als Lingua Franca, aber Sie könnten diesen Wrapper innerhalb der C-kompatiblen Teilmenge von C++ implementieren und niemals einen C-Compiler aufrufen.

    – Kartoffelklatsche

    9. September 2015 um 1:02 Uhr

  • “SQLite hat eine Anforderung für kleine ausführbare Codegröße, wo C einen leichten Vorteil hat.” Ich glaube nicht, dass in idiomatischem C++ geschriebenes SQLite binär größer oder langsamer als die C-Implementierung wäre. Es wäre sicherlich viel weniger C++-Code, und es könnte optionale LINQ- und Kompilierzeit-Abfragevoroptimierung und -kompilierung bieten. C würde dafür einen Codegenerator benötigen, und daher können Sie mit SQLITE keine Abfragen vorkompilieren. Ein C++-SQLITE würde es Ihnen ermöglichen, Datensätze mit range-for ohne dazwischenliegenden VM-Code zu durchlaufen, und es würde das C-SQLITE im Vergleich dazu im Schneckentempo erscheinen lassen. Schade…

    – Kuba hat Monica nicht vergessen

    18. Dezember 2020 um 17:48 Uhr


  • Tatsächlich hat eine typische größenbewusste eingebettete SQLITE-Anwendung einen festen Abfragesatz, und die Datenbank wird vom Flash mit festem Schema speicherzugeordnet, und der SQL-Interpreter und die VM sind totes Gewicht, ebenso wie eine Menge anderer Code. Ich habe einige Experimente mit dem Schreiben von Abfragen mit “rohem” C und mit Low-Level-Seitenzugriff in SQLITE durchgeführt, und für meine spezielle Anwendung konnte ich mehr oder weniger 85% des SQLITE-Codes verwerfen. Wenn überhaupt, verliert SQLITE viel Zeit, indem es C++ nicht nutzt, aber es ist auf Plattformen ausgerichtet, auf denen kein C++ verfügbar ist, und sie haben keinen C-Code-Generator für Abfragen implementiert.

    – Kuba hat Monica nicht vergessen

    18. Dezember 2020 um 17:55 Uhr


  • @UnslanderMonica 1. C++-Binärdateien haben Ausnahmebehandlungstabellen, die einen Rand hinzufügen, selbst wenn sie leer sind. 2. SQLite ist Bytecode-basiert. Die Abfrageoptimierung zur Kompilierzeit in C++ würde Parsing und Analyse in constexpr-Funktionen bedeuten, die keine Zeiger verwenden können. Das deutet auf architektonische Änderungen hin, sodass das Produkt nicht mehr SQLite wäre. 3. Gibt es keine Möglichkeit, den Bytecode zu speichern und den Text und den Parser aus den Binärdateien der Anwendung und Bibliothek zu entfernen? 4. Eine Parser-freie oder “kopflose” SQLite könnte mit einem C++-Header-Only-Bytecode-Generator/-Optimierer gekoppelt werden.

    – Kartoffelklatsche

    19. Dezember 2020 um 13:53 Uhr

David Rodríguez - Benutzeravatar von dribeas
David Rodríguez – Dribeas

Ich glaube nicht, dass der Grund so sehr mit der Leistung zusammenhängt, sondern mit der Interoperabilität. Die Sprache C++ ist komplexer als die Sprache C, aber aus Performance-Sicht sollte es in beiden Fällen keinen nennenswerten Unterschied geben. Einige C++-Konstrukte sind schneller als das C-Äquivalent (std::sort ist schneller als qsort) und es gibt wahrscheinlich gute Beispiele für den umgekehrten Weg.

BEARBEITEN: 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 unterschiedlichen Compilern/Versionen erstellt wurden. Das bemerkenswerteste Problem hier 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_function erstellt ein Symbol in der aufgerufenen Binärdatei my_function. Andererseits müssen die Namen von C++-Funktionen aufgrund von Features wie dem Überladen von Funktionen sein verstümmelt (übersetzt in verschiedene Funktionssymbole in der Binärdatei, die die Typen der Argumente und Rückgabetypen codieren), und der Standard definiert nicht, wie das Mangling durchgeführt wird. Das wiederum bedeutet, dass dieselbe Funktion in C++ je nach Compiler zu unterschiedlichen Symbolen kompiliert werden kann (es sei denn extern "C" wird verwendet, um die C-Interoperabilität für diese Funktionen in C++ zu erzwingen).

Am Ende des Tages müsste die Schnittstelle zwischen der Skriptsprache und dem nativen Code sowieso eine C-Schnittstelle sein, auch wenn die Details der internen Implementierung C/C++/jede andere native Sprache 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 das sehen einfach kann sich auf die Leistung auswirken)

  • Ich denke, man kann getrost sagen, dass modernes, idiomatisches C++ einen intelligenten Compiler benötigt, um Inlining, RVO, Constant Folding etc. voll auszunutzen. Damit ist es durchaus möglich, dass schwergewichtige C++-Konstruktionen überhaupt nicht auffallen Maschinenebene, aber ein guter Compiler ist für C++ viel wichtiger als für C.

    – Kerrek SB

    5. August 2011 um 10:58 Uhr


  • @Kerrek SB: Die meisten modern C++-Compiler (wobei modern die letzten paar Jahre bedeutet) sind wirklich gut darin, idiomatische C++-Konstrukte zu identifizieren und zu optimieren. Das std::sort ist ein solches Beispiel: die std::less Der standardmäßig verwendete Funktor ist nicht weniger effizient als die äquivalente C-Funktion, aber alle mir bekannten Compiler werden ihn einbetten (als Vorlage steht er zum Einbetten zur Verfügung) und alle Funktionsaufrufe an die entfernen compare Funktor.

    – David Rodríguez – Dribeas

    5. August 2011 um 11:27 Uhr

  • Lustigerweise von Electronic Arts OST Die Bibliothek wird teilweise durch die Behauptung gerechtfertigt, dass sie GCC als schlecht beim Inlining (und MSVC als viel besser) empfanden und dass die Standardbibliothek daher zu viele nicht optimierte Funktionsaufrufe verursachen würde. In EASTL verwenden sie weniger Umleitungen, um dies zu bekämpfen. Wer weiß, wie gut diese Argumentation heute noch hält.

    – Kerrek SB

    5. August 2011 um 11:34 Uhr


Wie Bjarne in erwähnt hat [D&E] die Effektivität ist eines der Hauptziele von C++. C ++ ist also nur langsamer, wenn der Programmierer seine “zusätzlichen” Funktionen wie die von Ihnen erwähnten virtuellen Funktionen, RTT-Informationen usw. verwendet

Ich denke also, es hat eher psychologische Gründe – C wird verwendet, da es keine “langsamen” C++-Funktionen zulässt.

Benutzeravatar von fortran
Fortran

Sprachen sind nicht von Natur aus schneller oder langsamer, Interpreter und Compiler können mehr oder weniger effizient sein.

Darüber hinaus bieten höhere Sprachen Abstraktionsschichten, die normalerweise Laufzeitkosten verursachen. Wenn Sie sie nicht verwenden, ist der Compiler möglicherweise schlau genug, sie zu entfernen, aber das ist 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 wird wahrscheinlich langsamer sein als die Verwendung der “langsamen” Sprache.

1421890cookie-checkIst C deutlich schneller als C++ [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy