Ich frage mich, ob es sich immer noch lohnt, mit modernen Compilern und ihren Optimierungen etwas kritischen Code in C anstatt in C ++ zu schreiben, um es schneller zu machen.
Ich weiß, dass C ++ zu einer schlechten Performance führt, wenn Klassen kopiert werden, während sie als Referenz übergeben werden können oder wenn Klassen automatisch vom Compiler erstellt werden, typischerweise mit überladenen Operatoren und vielen anderen ähnlichen Fällen; aber für einen guten C ++ - Entwickler, der all dies zu vermeiden weiß, lohnt es sich, Code in C zu schreiben, um die Leistung zu verbessern?
Ich werde vielen Kommentaren zustimmen. C-Syntax wird absichtlich (mit Divergenz nur in C99) in C ++ unterstützt. Daher müssen alle C ++ Compiler dies unterstützen. Tatsächlich finde ich es schwierig, dedizierte C-Compiler zu finden. In GCC wird zum Beispiel die gleiche Optimierungs- / Kompilierungs-Engine verwendet, unabhängig davon, ob der Code C oder C ++ ist.
Die eigentliche Frage ist dann, ob das Schreiben von reinem C-Code und das Kompilieren in C ++ zu einer Leistungseinbuße führt. Die Antwort ist, in jeder Hinsicht, nein. Es gibt ein paar knifflige Punkte über Ausnahmen und RTTI, aber das sind hauptsächlich Größenänderungen, keine Geschwindigkeitsänderungen. Sie würden so schwer gedrängt werden, ein Beispiel zu finden, das tatsächlich einen Leistungseinbruch bringt, dass es sich nicht lohnt, ein spezielles Modul zu schreiben.
Was über die von Ihnen verwendeten Funktionen gesagt wurde, ist wichtig. Es ist sehr einfach in C ++, über die Kopiersemantik schlampig zu werden und beim Kopieren von Speicher große Unkosten zu erleiden. Meiner Erfahrung nach ist dies der größte Kostenfaktor - in C kann man diese Kosten auch tragen, aber nicht so leicht, würde ich sagen.
Virtuelle Funktionsaufrufe sind immer etwas teurer als normale Funktionen. Gleichzeitig sind erzwungene Inline-Funktionen günstiger als normale Funktionsaufrufe. In beiden Fällen ist es wahrscheinlich, dass die Kosten für das Schieben / Knallen von Parametern aus dem Stapel teurer sind. Sich Gedanken über den Funktionsaufruf-Overhead zu machen, sollte jedoch ziemlich spät im Optimierungsprozess kommen - da es selten ein signifikantes Problem ist.
Ausnahmen sind kostenpflichtig (zumindest in GCC). Aber das Einrichten von Catch-Anweisungen und die Verwendung von RAII sind nicht mit erheblichen Kosten verbunden. Das war im GCC-Compiler (und anderen) so geplant, dass wirklich nur die Ausnahmefälle teuer sind.
Aber um es zusammenzufassen: Ein guter C ++ - Programmierer würde nicht in der Lage sein, seinen Code schneller laufen zu lassen, indem er einfach in C schreibt.
messen! messen , bevor Sie über die Optimierung nachdenken, messen vor dem Anwenden der Optimierung, messen nach dem Anwenden der Optimierung < stark> messen!
Wenn Sie Ihren Code 1 Nanosekunde schneller ausführen müssen (, weil er von 1000 Menschen verwendet wird, 1000 Mal in den nächsten 1000 Tagen und das zweite ist sehr wichtig ) ) geht alles.
Ja! es lohnt sich ...
-f
-Optionen) Was Sie nicht vergessen sollten, ist messen! .
PMG hat es genagelt. Messen Sie statt globaler Annahmen. Denken Sie auch so, Compiler wie gcc trennen das Front-, Middle- und Back-End. Das Frontend Fortran, C, C ++, Ada usw. endet also in der gleichen internen Mittelsprache, wenn Sie das tun, wird das meiste der Optimierung erreicht. Dann wird diese generische mittlere Sprache in Assembler für das spezifische Ziel umgewandelt, und es gibt zielspezifische Optimierungen, die auftreten. Also kann die Sprache mehr Code von der Front zur Mitte induzieren oder nicht, wenn sich die Sprachen stark unterscheiden, aber für C / C ++ würde ich annehmen, dass es dasselbe oder sehr ähnlich ist. Nun ist die binäre Größe eine andere Geschichte, die Bibliotheken, die in die Binärdatei für C nur vs C ++ gesaugt werden können, auch wenn es nur C-Syntax kann / wird variieren. Beeinflusst nicht notwendigerweise die Ausführungsleistung, sondern kann die Programmdatei aufladen, die Speicher- und Übertragungsdifferenzen sowie Speicheranforderungen kostet, wenn das Programm als eine Weile in RAM geladen wird. Hier nochmal, nur messen.
Ich füge auch zum Maßkommentar hinzu, kompiliere zu Assembler und / oder disassembliere die Ausgabe und vergleiche die Resultate deiner verschiedenen Sprachen / Compilerwahlen. Dies kann / wird die Timing-Unterschiede, die Sie beim Messen sehen, ergänzen.
Die Frage wurde bis zum Tod beantwortet, also werde ich das nicht hinzufügen.
Einfach als generische Frage, vorausgesetzt, Sie haben gemessen usw., und Sie haben festgestellt, dass ein bestimmtes C ++ (oder anderes) Codesegment nicht mit optimaler Geschwindigkeit läuft (was im Allgemeinen bedeutet, dass Sie nicht das richtige Werkzeug für den Job verwendet haben) ); und Sie wissen, dass Sie bessere Leistung erzielen können, indem Sie es in C schreiben, dann ja, definitiv, es ist es wert.
Es gibt eine bestimmte Denkweise, die häufig vorkommt und versucht, alles mit nur einem Werkzeug (Java oder SQL oder C ++) zu erledigen. Nicht nur Maslows Hammer, sondern die tatsächliche Überzeugung, dass sie ein C-Konstrukt in Java usw. codieren können. Dies führt zu allen Arten von Leistungsproblemen. Architektur, als ein echter Beruf, setzt Code-Segmente in den entsprechenden architektonischen Ort oder die Plattform. Es ist die richtige Kombination von Java, SQL und C, die Leistung liefert. Das erzeugt eine App, die nicht erneut besucht werden muss; ereignislose Ausführung. In diesem Fall ist es egal, ob oder wann C ++ diese Konstruktoren oder das implementiert.
Ich frage mich, ob es sich immer noch lohnt, mit modernen Compilern und ihren Optimierungen etwas kritischen Code in C anstatt in C ++ zu schreiben, um es schneller zu machen.
nein. halte es lesbar. Wenn Ihr Team c ++ oder c bevorzugt, bevorzugen Sie das - besonders, wenn es im Produktionscode bereits funktioniert (schreiben Sie es nicht ohne sehr gute Gründe um).
Ich weiß, dass C ++ zu einer schlechten Performance führt, wenn Klassen kopiert werden, während sie durch Referenz übergeben werden können.
verbietet dann das Kopieren und Zuweisen
oder wenn Klassen automatisch vom Compiler erstellt werden, normalerweise mit überladenen Operatoren und vielen anderen ähnlichen Fällen
Könnten Sie das näher ausführen? Wenn Sie sich auf Vorlagen beziehen, haben sie in Laufzeit keine zusätzlichen Kosten (obwohl sie zu zusätzlichen exportierten Symbolen führen können, was zu einer größeren Binärdatei führt). Tatsächlich kann die Verwendung einer Template-Methode die Performance verbessern, wenn (zum Beispiel) eine Konvertierung erforderlich wäre.
Aber für einen guten C ++ - Entwickler, der all dies vermeiden kann, lohnt es sich trotzdem, Code in C zu schreiben, um die Leistung zu verbessern?
Nach meiner Erfahrung kann ein Experte C ++ - Entwickler ein schnelleres, wartungsfreundlicheres Programm erstellen.
Sie müssen selektiv in Bezug auf die Sprachfunktionen sein, die Sie verwenden (und nicht verwenden). Wenn Sie C ++ - Funktionen auf den in c verfügbaren Satz herunterbrechen (z. B. Ausnahmen entfernen, virtuelle Funktionsaufrufe, rtti), dann haben Sie einen guten Start. Wenn Sie lernen, Templates zu verwenden, Metaprogrammierung, Optimierungstechniken, vermeiden Sie Aliasing (das wird immer schwieriger oder in c), dann sollten Sie auf Par oder schneller als c sein - mit einem Programm, das leichter zu verwalten ist (seit Sie sind vertraut mit C ++).
Wenn Sie die Funktionen von C ++ verwenden möchten, verwenden Sie C ++. Es hat viele Funktionen (von denen viele im Hinblick auf Geschwindigkeit / Kosten hinzugefügt wurden) und kann so schnell wie c (oder schneller) geschrieben werden.
Mit Templates und Metaprogrammierung könnten Sie viele Laufzeitvariablen in Kompilierzeitkonstanten für außergewöhnliche Gewinne verwandeln. manchmal geht das gut in das Gebiet der Mikrooptimierung.
Tags und Links c c++ performance micro-optimization