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?
c++
c
performance
Will03uk
quelle
quelle
Antworten:
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.
quelle
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.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::sort
ist schneller alsqsort
) 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_function
erstellt ein Symbol in der aufgerufenen Binärdateimy_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 (esextern "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)
quelle
std::sort
ist ein Beispiel: Derstd::less
standardmäß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 dencompare
Funktor entfernen .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.
quelle
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.
quelle
restrict
typisches 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).