Frage

Es wird gesagt, dass der Blitz++ bietet in der Nähe-performance Fortran.

Tut Fortran tatsächlich dazu neigen, schneller zu sein als normale C++ für gleichwertige Aufgaben?

Was ist mit den anderen HL Sprachen der außergewöhnlichen Laufzeit-performance?Ich habe gehört, einige Sprachen suprassing C++ für bestimmte Aufgaben...Objective Caml, Java, D...

Ich denke, GC kann viel code schneller, denn es entfernt die Notwendigkeit für übermäßige kopieren von auf der ganzen Stapel?(vorausgesetzt, der code ist nicht geschrieben für Leistung)

Ich Frage aus Neugier-ich immer davon ausgegangen, C++ ist so ziemlich unschlagbar Sperrung Experte ASM-coding.

War es hilfreich?

Lösung

Fortran ist schneller und fast immer besser als C ++ für rein numerischen Code. Es gibt viele Gründe, warum Fortran schneller ist. Es ist die älteste kompilierte Sprache (viel Wissen in optimierende Compiler). Es ist immer noch die Sprache für numerische Berechnungen, so stellen viele Compiler-Anbieter ihren Lebensunterhalt von optimierten Compiler zu verkaufen. Es gibt auch andere, aus technischen Gründen. Fortran (na ja, zumindest Fortran77) keine Zeiger, und somit nicht über die Aliasing-Probleme, die die C / C ++ Sprachen in dieser Domäne plagen. Viele Hochleistungsbibliotheken sind codiert noch in Fortran, mit einem langen (> 30 Jahre) Geschichte. Weder C oder C ++ keine guten Array-Konstrukte haben (C zu niedrig Niveau, C ++, so viele Array-Bibliotheken als Compiler auf dem Planeten hat, die alle nicht miteinander kompatibel sind, so dass ein Pool von gut getestet, schnellen Code zu verhindern).

Andere Tipps

Ob Fortran schneller als c ++ ist eine Frage der Diskussion. Manche sagen ja, manche nein sagen; Ich werde nicht darauf eingehen. Es hängt von den Compiler, die Architektur, die Sie es laufen auf, die Umsetzung des Algorithmus ... etc.

Wo Fortran hat ein großer Vorteil gegenüber C ist die Zeit, die Sie diese Algorithmen zu implementieren nimmt. Und das macht es extrem gut geeignet für jede Art von numerischen Berechnungen. Ich werde sagen, nur einige offensichtliche Vorteile gegenüber C:

  • 1-basierte Array-Indizierung (enorm hilfreich, wenn größere Modelle Implementierung und Sie müssen nicht darüber nachdenken, aber nur FORmula translate
  • hat einen Leistungs Operator (**) ( Gott, deren Idee war, dass eine Potenzfunktion tun? Statt einem Operator?! )
  • hat, würde ich sagen, die beste Unterstützung für mehrdimensionale Arrays von allen Sprachen auf dem heutigen Markt (und es scheint nicht, dass wird sich ändern, so bald) - A(1,2) wie in Mathe
  • nicht zu schweigen von den Schleifen zu vermeiden - A = B * C multipliziert die Arrays (fast wie Matlab-Syntax mit kompilierte Geschwindigkeit )
  • es Parallelität Merkmale in die Sprache (überprüfen Sie den neuen Standard auf diesem)
  • hat
  • sehr leicht anschließbaren mit Sprachen wie C, Python, so dass Sie Ihre schweren Berechnungen in Fortran machen, während .. was auch immer ... in der Sprache Ihrer Wahl, wenn Sie so geneigt fühlen
  • kompatibel vollständig rückwärts (da ganzer F77 ist eine Teilmenge von F90), so haben Sie ganzes Jahrhundert zur Verfügung Kodierung
  • sehr, sehr tragbar (dies möglicherweise nicht für einige Compiler-Erweiterungen arbeiten, aber im Allgemeinen funktioniert es wie ein Zauber)
  • problemorientierte Lösungs Gemeinschaft (seit Fortran Nutzer in der Regel nicht cs sind, aber Mathe, PHY, Ingenieure ... Menschen ohne Programmierung, sondern Problemlösung Erfahrung, deren Wissen über Ihre Problem kann sehr hilfreich)

Kann nicht an nichts anderes denkt aus der Spitze von meinem Kopf gerade jetzt, so wird dies tun müssen.

Was Blitz ++ konkurriert gegen ist nicht so sehr die Fortran Sprache, aber die vom Menschen Jahrhunderte der Arbeit geht in Fortran Mathematikbibliotheken. Bis zu einem gewissen Grad hilft die Sprache aus: eine ältere Sprache viel mehr Zeit, um optimierende Compiler hatte (und seien wir ehrlich, C ++ ist eine der komplexesten Sprachen). Auf der anderen Seite, hohe C ++ Bibliotheken wie Blitz ++ und uBLAS Ihre Absichten deutlicher als relativ Low-Level-Fortran-Code angeben können, und ermöglicht eine ganz neue Klassen von Kompilierung-Optimierungen.

jedoch unter Verwendung eines beliebigen Bibliothek effektiv die ganze Zeit erfordert Entwickler auch mit der Sprache vertraut sein, die Bibliothek und , um die Mathematik. Sie können in der Regel schneller Code erhalten, indem eine beliebige der drei Verbesserung ...

FORTAN ist in der Regel schneller als C ++ für Array-Signalverarbeitung wegen der unterschiedlichen Möglichkeiten, die Sprachen-Arrays implementieren - Fortran erlaubt kein Aliasing von Array-Elementen, während C ++ tut. Dies macht die Fortran-Compiler Arbeit leichter. Auch hat Fortran viele sehr ausgereift mathematische Bibliotheken, die seit fast 50 Jahren gearbeitet haben - C ++ hat nicht schon so lange

Dies wird eine Menge auf dem Compiler, Programmierer abhängen, ob es gc hat und zu viel variieren kann. Wenn es direkt in Maschinencode kompiliert wird, dann erwarten, eine bessere Leistung zu haben, als die meiste Zeit interpretiert, aber es ist eine endliche Menge von Optimierungs möglich, bevor Sie asm sowieso schneller.

Wenn jemand sagt, Fortran ist etwas schneller würden Sie ein neues Projekt in dieser ohnehin Code?

die Sache mit c ++ ist, dass es ganz in der Nähe der Hardware-Ebene ist. In der Tat können Sie auf der Hardwareebene programmieren (über Montageblocks). In der Regel c ++ Compiler einen ziemlich guten Job bei Optimierungen tun (für einen großen Geschwindigkeitsschub „Link-Time Code Generation“ ermöglichen die inlining von Funktionen zwischen den verschiedenen cpp-Dateien zu ermöglichen), aber wenn Sie die Hardware und haben das Know-how kennen Sie einige Funktionen in der Montage schreiben können, die noch schneller arbeiten (wenn auch manchmal, die Sie gerade nicht den Compiler schlagen).

Sie können auch implementieren Sie eigene Speicher-Manager sind (was etwas ist, viele andere Hochsprachen nicht zulassen), so können Sie sie für Ihre spezifische Aufgabe anpassen (vielleicht die meisten Zuweisungen 32 Bytes oder weniger, dann können Sie nur eine riesige Liste von 32-Byte-Puffer, die Sie O (1) Zeit / Freisetzen in) zuordnen können. Ich glaube, dass c ++ jede andere Sprache schlagen, so lange wie Sie in vollem Umfang die Compiler und die Hardware zu verstehen, die Sie verwenden. Die Mehrheit der es darum geht, was Algorithmen Sie mehr verwenden, als irgendetwas anderes.

Sie müssen mit einigen ungerade verwalteten XML-Parser, wie Sie diese Seite dann laden. :)

Wir kontinuierlich Profilcode und die Verstärkung ist konsequent (und das ist nicht naiv C ++, ist es nur moderne C ++ mit Buh-Rufe). Sie ebnet consistensly jede CLR Implementierung von mindestens 2 x und oft von 5x oder mehr. Ein wenig besser als Java Tage, als es war um 20x mal schneller, aber man kann immer noch gute Instanzen und einfach zu beseitigen all System.Object aufblasen finden und deutlich schlagen zu Brei.

Eine Sache verwaltet Devs nicht bekommen, ist, dass die Hardware-Architektur gegen jede Skalierung von VM ist und Objektstamm aproaches. Sie müssen sehen, um es zu glauben, hängen an, einen Browser anwerfen und gehen Sie zu einem ‚dünnen‘ VM wie Silverlight. Sie werden schocked, wie langsam und CPU hungrig ist.

Zwei, geschossen von einem Datenbank-App für jede Leistung, ja vs nativen db verwaltet.

Ich schrieb dies nur wenige Minuten vor:

C ++ String Speicherverwaltung

Es ist in der Regel der Algorithmus nicht die Sprache, die die Leistung Baseballstadion bestimmt, die Sie in enden werden.

Im Rahmen dieses Baseballstadion können optimierende Compiler produzieren in der Regel besser als die meisten Codes Montag Coder.

Vorzeitige Optimierung ist die Wurzel aller Übel

Dies kann die „allgemein bekannt“, dass jeder Papagei kann, aber ich trage vor, wahrscheinlich, weil es richtig ist. Ich erwarte konkrete Beweise für das Gegenteil.

D kann manchmal schneller als C ++ in praktischen Anwendungen, vor allem, weil die Anwesenheit von Garbage Collection hilft, den Overhead von RAII und Referenzzählung zu vermeiden, wenn intelligente Zeiger verwenden. Für Programme, die großen Mengen von kleinen Objekten mit nicht-trivialen Lebenszyklen zuzuweisen, kann Garbage Collection schneller als C ++ - Stil Speicherverwaltung. Auch erlauben D's builtin Arrays der Compiler bessere Optimierungen in einigen Fällen als C ++ 's STL-Vektor durchzuführen, die der Compiler nicht versteht. Darüber hinaus unterstützt D2 unveränderliche Daten und reine Funktion Annotationen, die aktuellen Versionen von DMD2 optimieren basiert. Walter Hell, D's Schöpfer, schrieben ein JavaScript-Interpreter sowohl in D und C ++, und nach ihm, die D-Version ist schneller.

Es hängt alles von dem Compiler, nehmen zum Beispiel der Stalin Scheme-Compiler, es schlägt fast alle Sprachen in der Debian-Mikro-Benchmark-Suite, aber erwähnen, dass sie etwas über Kompilierungszeiten?

Nein

, vermute ich (ich habe nicht verwendet Stalin vor) Kompilieren für Benchmarks (IOW alle Optimierungen bei maximaler Anstrengung Ebenen) hat eine lustige lange Zeit für alles andere als die kleinsten Teile des Codes.

, wenn der Code nicht für die Leistung geschrieben und C # ist schneller als C ++ .

Ein notwendiger und rechtlicher Hinweis: Alle Benchmarks sind böse

.

Hier ist Benchmarks, die für C ++ .

Die beiden oben genannten Verbindungen zeigen, dass wir Fälle finden können, wo C ++ schneller als C # ist und umgekehrt.

Performance von einer kompilierten Sprache ist ein nutzloses Konzept: Was ist wichtig, die Qualität des Compilers ist, das heißt, welche Optimierungen es in der Lage ist, zu übernehmen. Zum Beispiel oft - aber nicht immer - der Intel C ++ Compiler erzeugt eine bessere Leistung Code als g ++. So wie misst man die Leistung von C ++?

Wo Sprache Semantik kommen ist, wie einfach es ist, für die Programmierer der Compiler zu erhalten optimale Ausgabe zu erstellen. Zum Beispiel ist es oft einfacher, Fortran-Code als C-Code parallelisieren, weshalb Fortran immer noch stark für High-Performance-Berechnung (zB Klimasimulationen) verwendet wird.


Da die Frage und einige der Assembler genannten Antworten: das gleiche gilt hier ist, es ist nur eine andere kompilierte Sprache und somit nicht von Natur aus ‚schneller‘. Der Unterschied zwischen Assembler und anderen Sprachen ist, dass der Programmierer - die im Idealfall der absolute Wissen über das Programm hat -. Für alle Optimierungen verantwortlich ist, anstatt einige von ihnen auf die ‚stummen‘ Compiler Delegieren

Eg Funktionsaufrufe in Assembler können Register verwenden Argumente zu übergeben und müssen nicht unnötig Stack-Frames erstellen, aber ein guter Compiler dies auch tun kann (man denke inlining oder Fastcall). Der Nachteil von Assembler ist, dass leistungsfähigere Algorithmen sind schwerer zu (man denke lineare Suche vs. binäre seach, hashtable Lookup, ...) zu implementieren.

Deutlich besser als C++ wird meist über die Herstellung der compiler verstehen, was der Programmierer bedeutet.Ein Beispiel HIERFÜR könnte ein Beispiel, wo ein compiler einer Sprache bedeutet, dass eine region der code ist unabhängig von seiner Eingänge und gerade berechnet, das Ergebnis mit dem Wert zum Zeitpunkt der Kompilierung.

Ein weiteres Beispiel dafür ist, wie C# - produziert einige sehr hohe Leistung code einfach deshalb, weil der compiler weiß, was Besondere Sprüche 'bedeuten' und können gekonnt verwenden Sie die Implementierung, die produziert die höchste Leistung, wo eine transliteration des gleichen Programms in C++ resultiert in unnötig alloc/löschen Zyklen (verdeckt durch Vorlagen), da der compiler ist der Umgang mit dem Allgemeinen Fall, anstatt den bestimmten Fall, dieses Stück code gibt.

Ein letztes Beispiel könnte in den Bach/Cuda-Anpassungen von C-entwickelt für exotische hardware, die nicht so exotisch mehr.Die Sprache unterstützt die exakte primitive (kernel-Funktionen) zugeordnet werden, die nicht von der von-neuman-hardware wird zusammengestellt für.

Das ist, warum Sie einen verwalteten Browser verwenden? Weil es schneller. Oder verwalten OS, weil es schneller ist. Nee, Moment mal, es die SQL-Datenbank ist .. Warten Sie, es muss das Spiel sein, Sie spielen. Halt, es muss ein Stück numerischen Code Java seinen adn Csharp ist offen nutzlos mit. BTW, müssen Sie überprüfen, was Ihre VM geschrieben wird, um die Root-Sprache Schlacke und sagen, dass es langsam ist.

Was für eine misconecption, aber hey zeigen Sie mir eine schnelle Managed App so können wir alle haben ein Lachen. VS? Openoffice?

C # ist viel schneller als C ++ - in C # kann ich einen XML-Parser und Datenprozessor in einem zehnten mir es nimmt sich die Zeit schreiben, es zu schreiben C ++.

Oh, meinst du Ausführungsgeschwindigkeit?

Auch dann, wenn Sie die Zeit von der ersten Zeile des Codes bis zum Ende der ersten Ausführung des Codes geschrieben nehmen, C # wahrscheinlich immer noch schneller als C ++.

Dies ist ein sehr interessanter Artikel über ein C ++ Programm in C # Umwandlung und der Aufwand erforderlich, um die C ++ schneller als die C # zu machen.

Wenn Sie also die Entwicklungsgeschwindigkeit zu berücksichtigen, fast alles schlägt C ++.

OK, tht OP der Laufzeit nur Leistungsanforderung Adresse: Es ist nicht das Langauge, es ist die Implementierung der Sprache , die die Laufzeitleistung bestimmt. Ich könnte einen C ++ Compiler schreiben, dass der langsamste Code vorstellbar produziert, aber es ist immer noch C ++. Es ist auch theoretisch möglich, einen Compiler für Java zu schreiben, die IA32-Anweisungen, anstatt den Java VM Byte-Codes ausgerichtet ist, eine Laufzeitgeschwindigkeitsschub zu geben.

Die Leistung des Codes wird zwischen den Stärken der Sprache und den Anforderungen des Codes auf die Passform abhängen. Zum Beispiel kann ein Programm, das viele Speicherzuweisung tut / Deallokation wird führen schlecht in einem naiven C ++ Programm (dh die Standard Speicherzuordner verwenden), da die C ++ Strategie Speicherzuweisung zu verallgemeinert ist, während C # 's GC basierte allocator besser durchführen kann (wie die Link oben zeigt). String-Manipulation ist langsam in C ++, aber schnell in Sprachen wie PHP, Perl, etc.

Ahh ... Die gute alte Frage - der Compiler macht schnellen Code

  1. Es ist nur insofern von Code, der eigentlich viel Zeit an der Unterseite des Call-Stack verbringt, das heißt hot spots, die nicht enthalten Funktionsaufrufe, wie Matrix-Inversion, etc.

  2. (Impliziert durch 1) Es ist nur insofern von Code tatsächlich sieht der Compiler. Wenn Ihr Programmzähler all seine Zeit in 3rd-Party-Bibliotheken verbringt man nicht bauen, spielt es keine Rolle.

  3. Im Code, wo es keine Rolle spielt, es kommt alles auf dem Compiler besser ASM macht, und das ist ganz wesentlich davon ab, wie intelligent oder dumm der Quellcode geschrieben wird.

Mit all diesen Variablen, ist es schwer, zwischen guten Compiler zu unterscheiden.

Doch wie gesagt, wenn Sie eine Menge von Fortran-Code haben zu kompilieren, nicht neu schreibt es.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top