Frage

Von Zeit zu Zeit lese ich, dass Fortran für umfangreiche Berechnungen schneller als C ist oder sein kann.Ist das wirklich wahr?Ich muss zugeben, dass ich Fortran kaum kenne, aber der Fortran-Code, den ich bisher gesehen habe, hat nicht gezeigt, dass die Sprache Funktionen hat, die C nicht hat.

Wenn es wahr ist, sagen Sie mir bitte warum.Bitte sagen Sie mir nicht, welche Sprachen oder Bibliotheken für die Zahlenverarbeitung geeignet sind. Ich habe nicht vor, dafür eine App oder Bibliothek zu schreiben, ich bin nur neugierig.

War es hilfreich?

Lösung

Die Sprachen verfügen über ähnliche Funktionssätze.Der Leistungsunterschied ergibt sich aus der Tatsache, dass Fortran sagt, dass Aliasing nicht zulässig ist, es sei denn, eine EQUIVALENCE-Anweisung wird verwendet.Jeder Code mit Aliasing ist kein gültiger Fortran, aber es liegt am Programmierer und nicht am Compiler, diese Fehler zu erkennen.Daher ignorieren Fortran-Compiler ein mögliches Aliasing von Speicherzeigern und ermöglichen ihnen, effizienteren Code zu generieren.Schauen Sie sich dieses kleine Beispiel in C an:

void transform (float *output, float const * input, float const * matrix, int *n)
{
    int i;
    for (i=0; i<*n; i++)
    {
        float x = input[i*2+0];
        float y = input[i*2+1];
        output[i*2+0] = matrix[0] * x + matrix[1] * y;
        output[i*2+1] = matrix[2] * x + matrix[3] * y;
    }
}

Diese Funktion würde nach der Optimierung langsamer laufen als das Fortran-Gegenstück.Warum so?Wenn Sie Werte in das Ausgabearray schreiben, können Sie die Werte der Matrix ändern.Schließlich könnten sich die Zeiger überlappen und auf denselben Speicherblock verweisen (einschließlich int Zeiger!).Der C-Compiler ist gezwungen, für alle Berechnungen die vier Matrixwerte aus dem Speicher neu zu laden.

In Fortran kann der Compiler die Matrixwerte einmal laden und in Registern speichern.Dies ist möglich, da der Fortran-Compiler davon ausgeht, dass sich Zeiger/Arrays im Speicher nicht überlappen.

Zum Glück ist das restrict Schlüsselwort und striktes Aliasing wurden in den C99-Standard eingeführt, um dieses Problem zu beheben.Heutzutage wird es auch von den meisten C++-Compilern gut unterstützt.Mit dem Schlüsselwort können Sie dem Compiler einen Hinweis geben, dass der Programmierer verspricht, dass ein Zeiger kein Alias ​​mit einem anderen Zeiger bildet.Das strikte Aliasing bedeutet, dass der Programmierer verspricht, dass sich Zeiger unterschiedlichen Typs niemals überlappen, zum Beispiel a double* wird sich nicht mit einem überschneiden int* (mit der konkreten Ausnahme, dass char* Und void* kann sich mit allem überschneiden).

Wenn Sie sie verwenden, erhalten Sie die gleiche Geschwindigkeit von C und Fortran.Allerdings ist die Möglichkeit, das zu nutzen restrict Schlüsselwort nur mit leistungskritischen Funktionen bedeutet, dass C- (und C++-)Programme viel sicherer und einfacher zu schreiben sind.Betrachten Sie beispielsweise den ungültigen Fortran-Code: CALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30), das die meisten Fortran-Compiler gerne und ohne Vorwarnung kompilieren, aber einen Fehler mit sich bringt, der nur auf einigen Compilern, auf mancher Hardware und bei einigen Optimierungsoptionen auftritt.

Andere Tipps

Ja, im Jahr 1980; in 2008? hängt

Wenn ich professionell die Geschwindigkeit Dominanz von Fortran Programmierung gestartet wurde nur in Frage gestellt. Ich erinnere mich an Lesung über es in Dr. Dobbs und erzählen die älteren Programmierer über den Artikel -. lachten sie

So habe ich zwei Ansichten darüber, theoretische und praktische. In der Theorie Fortran heute hat keinen inneren Vorteil zu C / C ++ oder auch jede Sprache, die Assembler-Code ermöglicht. In der Praxis Fortran heute noch genießt die Vorteile der Erbe einer Geschichte und Kultur rund um die Optimierung des numerischen Code gebaut.

Bis einschließlich Fortran 77, Sprache Design-Überlegungen hatten Optimierung als Schwerpunkt. Durch den Stand der Compiler Theorie und Technologie, diese oft gemeint Einschränkung Eigenschaften und Fähigkeiten, um dem Compiler die beste Chance auf die Optimierung des Codes zu geben. Eine gute Analogie ist von Fortran 77 als Profi-Rennwagen zu denken, die Funktionen für die Geschwindigkeit opfert. In diesen Tagen Compiler haben besser geworden in allen Sprachen und Features für die Produktivität der Programmierer sind mehr geschätzt. Allerdings gibt es immer noch Orte, an denen die Menschen vor allem mit Geschwindigkeit in wissenschaftlichem Rechnen betroffen sind; diese Menschen haben die meisten wahrscheinlich geerbt Code, Ausbildung und Kultur von Menschen, die sich Fortran-Programmierer waren.

Wenn man beginnt zu sprechen über die Optimierung des Codes gibt es viele Fragen ist und der beste Weg, um ein Gefühl zu bekommen, dafür ist lauern, wo die Menschen, deren Job sind, ist es schnell Zahlencode haben. Aber bedenken Sie, dass eine solche kritisch sensiblen Code ist in der Regel ein kleiner Bruchteil der Gesamtcodezeilen und sehr spezialisiert: Viele Fortran-Code ist nur als „ineffizient“, wie viele andere Code in anderen Sprachen und Optimierung nicht einmal ein vorrangiges Anliegen eines solchen Codes sein sollte.

Ein wunderbarer Ort in dem Lernen über die Geschichte und Kultur von Fortran zu starten ist wikipedia. Der Fortran Wikipedia-Eintrag ist hervorragend und ich freuen uns sehr über diejenigen, die die Zeit und Mühe genommen haben, um es von Wert für die Fortran-Community.

(Eine gekürzte Version dieser Antwort wäre ein Kommentar in dem ausgezeichneten Thread gestartet wird von Nils , aber ich habe nicht das Karma, das zu tun. Eigentlich habe ich wahrscheinlich nicht geschrieben habe alles an alle, aber für diesen diesen Thread hat tatsächlichen Informationsgehalt und die gemeinsame Nutzung im Gegensatz Krieg und Sprache Bigotterie Flamme, die meine Haupt Erfahrung mit diesem Thema ist. ich war überwältigt und hatte die Liebe zu teilen.)

Zu einem gewissen Grad ist Fortran entwickelt Compiler-Optimierung im Auge behalten. Die Sprache unterstützt gesamte Array Operationen, bei denen Compilern Parallelität ausnutzen kann (speziell auf Multi-Core-Prozessoren). Zum Beispiel:

Dense Matrixmultiplikation ist einfach:

matmul(a,b)

L2-Norm eines Vektors x ist:

sqrt(sum(x**2))

Darüber hinaus Aussagen wie FORALL, PURE & ELEMENTAL Verfahren usw. weitere Hilfe Code zu optimieren. Auch Zeiger in Fortran Arent so flexibel wie C wegen dieser einfachen Grund.

Der kommende Fortran-Standard (2008) hat Co-Arrays, die Sie leicht schreiben parallel Code ermöglicht. G95 (Open Source) und Compiler von Cray unterstützen es bereits.

Also ja Fortran kann schnell einfach sein, weil Compiler kann es optimieren / parallelisieren besser als C / C ++. Aber auch hier, wie alles andere im Leben gibt es gute Compiler und schlechte Compiler.

Es ist schon komisch, dass viele Antworten hier aus nicht den Sprachen zu kennen. Dies gilt insbesondere für C / C ++ Programmierer, die alten und Fortran 77 Code und diskutieren die Schwächen geöffnet haben.

Ich nehme an, dass die Geschwindigkeit Problem ist vor allem eine Frage zwischen C / C ++ und Fortran. In einem riesigen Code, es kommt immer darauf an den Programmierer. Es gibt einige Features der Sprache, die Fortran trifft und einige Funktionen, die C der Fall ist. Also, im Jahr 2011, kann niemand wirklich sagen, welches schneller ist.

über die Sprache selbst, Fortran unterstützt heute Voll OOP Features und es ist voll abwärtskompatibel. Ich habe die Fortran 2003 gründlich verwendet, und ich würde sagen, es war einfach wunderschön, es zu benutzen. In einigen Aspekten ist Fortran 2003 noch hinter C ++, aber die auf der Nutzung aussehen lassen. Fortran wird meistens für Numerische Berechnung verwendet, und niemand nutzt Phantasie C ++ OOP Features wegen Geschwindigkeitsgründen. In High Performance Computing, hat C ++ fast keinen Platz zu gehen (einen Blick auf die MPI-Standard haben, und Sie werden sehen, dass C ++ veraltet ist!).

Heutzutage kann man einfach gemischte Sprachenprogrammierung tun mit Fortran und C / C ++. Es gibt auch Schnittstellen für GTK + in Fortran. Es gibt freie Compiler (gfortran, G95) und viele ausgezeichnete kommerziellen.

Es gibt mehrere Gründe, warum Fortran schneller sein könnte. Allerdings ist die Menge, die sie Materie ist so belanglos oder kann sowieso um gearbeitet werden, dass es sollte keine Rolle spielen. Der Hauptgrund Fortran verwendet heutzutage ist die Erhaltung oder Erweiterung von Legacy-Anwendungen.

  • PURE und elementares Schlüsselwörter auf Funktionen. Dies sind Funktionen, die keine Nebenwirkungen haben. Dies ermöglicht Optimierungen in bestimmten Fällen, in denen der Compiler die gleiche Funktion kennt, werden mit den gleichen Werten aufgerufen werden. Hinweis: GCC „reiner“ als Erweiterung der Sprache implementiert. Andere Compiler kann auch. Inter-Modul-Analyse kann auch diese Optimierung durchführt, aber es ist schwierig.

  • Standardsatz von Funktionen, die mit Arrays umgehen, nicht einzelne Elemente. Sachen wie sin (), log (), sqrt () nehmen Arrays statt Skalare. Dies macht es einfacher, die Routine zu optimieren. Auto-Vektorisierung gibt die gleichen Vorteile in den meisten Fällen, wenn diese Funktionen inline oder builtins

  • Builtin komplexer Typ. Theoretisch lassen könnte der Compiler bestimmte Anweisungen in bestimmten Fällen neu zu ordnen oder zu beseitigen, aber wahrscheinlich würden Sie den gleichen Nutzen mit der Struktur {double re, im sehen; }; Idiom verwendet in C. Es macht für eine schnellere Entwicklung, obwohl die Betreiber die Arbeit an komplexen Typen in Fortran.

Ich glaube, der entscheidende Punkt für Fortran ist, dass es sich um eine Sprache etwas besser geeignet für die Expression ist Vektor- und Array-basierte Mathematik. Die Zeigeranalyse Problem oben ausgeführt ist real in der Praxis, da portablen Code übernehmen kann nicht wirklich, dass Sie einen Compiler etwas sagen können. Es ist immer ein Vorteil zum Ausdruck computaitons in einer Art und Weise näher zu, wie die Domäne aussieht. C ist wirklich nicht an allen haben Arrays, wenn man genau hinschaut, nur etwas, das Art wie es sich verhält. Fortran echte arrawys. Was macht es einfacher für bestimmte Arten von Algorithmen speziell für parallele Maschinen zu kompilieren.

Tief unten in Dingen wie Laufzeitsystem und Aufrufkonventionen, C und moderne Fortran ausreichend ähnlich ist, dass es schwer zu sehen, was einen Unterschied machen würde. Beachten Sie, dass C ist hier wirklich Base C: C ++ ein mit sehr unterschiedlichen Leistungsmerkmalen ganz anderes Problem.

Es gibt nicht so etwas wie eine Sprache schneller ist als die andere, so dass die richtige Antwort ist nicht .

Was haben Sie wirklich zu fragen, ist „wird Code mit Fortran-Compiler kompiliert X schneller als entsprechende Code mit C-Compiler kompiliert Y?“ Die Antwort auf diese Frage hängt natürlich von dem zwei Compiler Sie wählen.

Eine andere Frage, die man fragen könnte nach dem Vorbild der wäre „Bei gleichem Aufwand in ihrer Compiler Optimierung setzen, die Compiler schneller Code erzeugt?“ Die Antwort auf diese wäre in der Tat Fortran . Fortran Compiler haben certian Vorteile:

  • Fortran hatte mit Versammlung wieder in den Tag zu konkurrieren, wenn einige nie Compiler verwenden geschworen, so wurde es auf Geschwindigkeit ausgelegt. C wurde entwickelt, um flexibel zu sein.
  • Fortran Nische wurde Zahlknirschens. In diesem Bereich Code ist nie schnell genug. So gibt es immer eine Menge Druck, effizienten, die Sprache zu halten.
  • Die meisten der Forschung in Compiler-Optimierungen wird von Menschen interessieren getan bei der Beschleunigung Fortran Zahlencode Knirschen, so Fortran-Code zu optimieren ist ein viel besseren bekanntes Problem als andere kompilierte Sprache zu optimieren und neue Innovationen zeigen erste in Fortran-Compiler auf.
  • Biggie : C fördert viel mehr Zeiger Verwendung als Fortran. Dieser drasticly erhöht den möglichen Umfang eines Datenelementes in einem C-Programm, das sich weit schwieriger zu optimieren macht. Beachten Sie, dass Ada auch viel besser als C in diesem Bereich ist, und ist eine viel modernere OO Sprache als die häufigsten vorkommende Fortran77. Wenn Sie ein OO-Langauge mögen, die schnelleren Code als C erzeugen kann, ist dies eine Option für Sie.
  • Durch wieder auf seine Nummer-Knirschen Nische, neigen die Kunden von Fortran-Compiler mehr über die Optimierung als die Kunden von C-Compiler.
  • Pflege

Allerdings gibt es nichts jemanden davon abhalten, eine Tonne Aufwand in ihre C-Compiler der Optimierung setzen, und machte es als das ihre Plattform Fortran Compiler besseren Code zu erzeugen. In der Tat macht der größere Umsatz der C-Compiler dieses Szenario durchaus möglich

Es gibt einen weiteren Punkt, bei dem Fortran anders als C ist – und möglicherweise schneller.Fortran hat bessere Optimierungsregeln als C.In Fortran ist die Auswertungsreihenfolge eines Ausdrucks nicht definiert, was es dem Compiler ermöglicht, sie zu optimieren – wenn man eine bestimmte Reihenfolge erzwingen möchte, muss man Klammern verwenden.In C ist die Reihenfolge viel strenger, aber mit „-fast“-Optionen sind sie lockerer und „(...)“ werden ebenfalls ignoriert.Ich denke, Fortran hat einen Weg, der gut in der Mitte liegt.(Nun ja, IEEE macht das Leben schwieriger, da bestimmte Änderungen der Auswertungsreihenfolge erfordern, dass keine Überläufe auftreten, die entweder ignoriert werden müssen oder die Auswertung behindern).

Ein weiterer Bereich intelligenterer Regeln sind komplexe Zahlen.Nicht nur, dass es bis C 99 dauerte, bis C sie hatte, auch die Regeln, die sie regeln, sind in Fortran besser;Da die Fortran-Bibliothek von gfortran teilweise in C geschrieben ist, aber die Fortran-Semantik implementiert, hat GCC die Option erhalten (die auch mit „normalen“ C-Programmen verwendet werden kann):

-Fcx-Fortran-Rules-Komplex-Multiplikation und Abteilung Befolgen Sie die Forran-Regeln.Die Bereichsreduzierung erfolgt im Rahmen einer komplexen Division, es wird jedoch nicht überprüft, ob das Ergebnis einer komplexen Multiplikation oder Division „NaN + I*NaN“ ist, und in diesem Fall wird versucht, die Situation zu retten.

Die oben erwähnten Alias-Regeln sind ein weiterer Bonus und auch – zumindest im Prinzip – die Operationen für das gesamte Array, die, wenn sie vom Optimierer des Compilers richtig berücksichtigt werden, zu schnellerem Code führen können.Im Gegensatz dazu nehmen bestimmte Vorgänge mehr Zeit in Anspruch, z.B.Wenn man eine Zuweisung zu einem zuweisbaren Array vornimmt, sind zahlreiche Überprüfungen erforderlich (Neuzuweisung?[Fortran 2003-Funktion] verfügt über die Array-Schritte usw.), die die einfache Operation hinter den Kulissen komplexer machen – und damit langsamer, aber die Sprache leistungsfähiger machen.Andererseits erleichtern die Array-Operationen mit flexiblen Grenzen und Schritten das Schreiben von Code – und der Compiler optimiert den Code normalerweise besser als ein Benutzer.

Insgesamt denke ich, dass sowohl C als auch Fortran ungefähr gleich schnell sind;Die Wahl sollte eher darin bestehen, welche Sprache einem besser gefällt oder ob die Verwendung der Whole-Array-Operationen von Fortran und seiner besseren Portabilität nützlicher ist – oder die bessere Anbindung an System- und grafische Benutzeroberflächenbibliotheken in C.

Es gibt nichts über die Sprachen Fortran und C, die für bestimmte Zwecke eine schneller als die anderen macht. Es gibt Dinge, über bestimmte Compiler für jede dieser Sprachen, die als andere etwas günstiger für bestimmte Aufgaben mehr machen.

Seit vielen Jahren gab es Fortran-Compiler, die auf Ihre numerische Routinen schwarze Magie tun könnte, viele wichtige Berechnungen wahnsinnig schnell zu machen. Der moderne C-Compiler konnte es nicht tun, auch. Als Ergebnis wuchs eine Reihe von großen Bibliotheken von Code in Fortran. Wenn Sie diese gut getestet, reifen, wunderbare Bibliotheken verwenden möchten, können Sie den Fortran Compiler auszubrechen.

Meine informellen Beobachtungen zeigen, dass in diesen Tagen der Menschen in jeder alten Sprache ihre schweren Rechen Sachen codieren, und wenn es eine Weile dauert, Compute-Cluster finden sie Zeit auf etwas billig. Moores Gesetz macht Narren von uns allen.

Ich vergleiche Geschwindigkeit von Fortran, C und C ++ mit der klassischen Levine-Callahan-Dongarra Benchmark von netlib. Die mehrsprachige Version, mit OpenMP ist http://sites.google.com/site/tprincesite/levine-callahan -dongarra-Vektoren Das C ist häßlichere, wie es mit automatischer Übersetzung begonnen, sowie Einfügung begrenzen und für bestimmte pragmas Compilern. C ++ ist nur C mit STL-Vorlagen, wo anwendbar. Aus meiner Sicht ist die STL ein Mischbeutel, ob es verbessert die Wartbarkeit.

Es gibt nur minimale Bewegung der automatischen Funktion in-Auskleidung zu sehen, inwieweit sie verbessert Optimierung, da die Beispiele auf traditionelle Fortran Praxis basieren, wo wenig Vertrauen ist am in-Futter.

Die C / C ++ Compiler, der mit Abstand der am weitesten verbreiteten Nutzung hat fehlt Auto-Vektorisierung, auf denen dies Benchmarks stützt sich stark.

Re die Post, die kurz vor diesem kam: es gibt ein paar Beispiele, wo Klammern verwendet werden, in Fortran die schneller oder genauer Reihenfolge der Auswertung zu diktieren. Bekannte C-Compiler keine Optionen haben, um die Klammern zu beobachten, ohne weitere wichtige Optimierungen zu deaktivieren.

ich tat einige umfangreiche Mathematik mit Fortran und C für ein paar Jahre. Ich kann aus eigener Erfahrung sagen, dass Fortran ist manchmal wirklich besser als C, aber nicht für seine Geschwindigkeit (man kann C so schnell wie Fortran durch entsprechende Codierung Stil machen ausführen), sondern wegen der sehr gut optimierte Bibliotheken wie LAPACK, und wegen großer parallelisiert. Auf meiner Meinung nach, ist Fortran wirklich peinlich, mit zu arbeiten, und ihre Vorteile sind nicht gut genug, diesen Nachteil aufzuheben, so dass nun C + GSL Ich bin mit Berechnungen zu tun.

Ich bin ein Bastler Programmierer und ich bin „durchschnittlich“ sowohl auf die Sprache. Ich finde es einfacher, schnell Fortran-Code als C zu schreiben (oder C ++) Code. Sowohl Fortran und C ist „historische“ Sprachen (von heute Standard), wird stark genutzt, und hat auch freie und kommerzielle Compiler unterstützt.

Ich weiß nicht, ob es sich um eine historische Tatsache ist aber Fortran fühle mich wie es gebaut ist parallel / verteilt / vektorisiert werden / was auch immer-many-Kerne-ized. Und heute ist es so ziemlich das „Standard-Metrik“, wenn wir reden über Geschwindigkeit: „ist es skalieren“

Für die reine CPU-Knirschen i Fortran lieben. Für alles, was IO Zusammenhang finde ich es einfacher, mit C zu arbeiten (es ist in beiden Fällen schwierig ist, sowieso).

Jetzt natürlich, für die parallele Mathematik intensiv Code möchten Sie wahrscheinlich Ihre GPU nutzen. Sowohl C und Fortran haben eine Menge mehr oder weniger gut integrierte CUDA / OpenCL-Schnittstelle (und jetzt OpenACC).

Meine mäßig objektive Antwort lautet: Wenn Sie sowohl die Sprache wissen genauso gut / schlecht, dann denke ich, Fortran schneller ist, weil ich es einfacher finden parallel / verteilte Code in Fortran als C zu schreiben (wenn Sie verstehen, dass Sie „Freiform schreiben "fortran und nicht nur streng F77-Code)

Hier ist eine zweite Antwort für diejenigen bereit, mich zu downvote, weil sie die erste Antwort nicht mag: Beide Sprache die Funktionen, die erforderlich Hochleistungs Code zu schreiben. Es ist also abhängig von dem Algorithmus Sie Implementierung (CPU-Kapazität? Io-Kapazität? Speicherintensiv?), Die Hardware (Single-CPU? Multi-Core? Verteilen Supercomputer? GPGPU? FPGA?), Ihre Fähigkeiten und letztlich den Compiler selbst. Sowohl C und Fortran haben ehrfürchtige Compiler. (Ich bin ernsthaft erstaunt, wie fortschrittlich Fortran Compiler sind aber so ist C-Compiler).

PS: ich bin froh, dass Sie speziell Libs ausgeschlossen, weil ich sehr viel schlechte Sachen haben über Fortran GUI Libs zu sagen. :)

Ich habe nicht gehört, dass Fortan ist deutlich schneller als C, aber es könnte denkbar tht in bestimmten Fällen schneller sein würde. Und der Schlüssel nicht in den Sprachfunktionen, die vorhanden sind, aber in denen, die (in der Regel) nicht vorhanden.

Ein Beispiel sind C Zeiger. C Zeiger sind so ziemlich überall dort zum Einsatz, aber das Problem mit Zeigern ist, dass der Compiler in der Regel kann nicht sagen, ob sie zu den verschiedenen Teilen des gleichen Array zeigt sind.

Wenn Sie zum Beispiel schrieb ein strcpy Routine, die sah wie folgt aus:

strcpy(char *d, const char* s)
{
  while(*d++ = *s++);
}

Der Compiler hat unter der Annahme arbeiten, dass die d und s könnte überlappende Arrays sein. So kann es nicht eine Optimierung durchführen, die zu unterschiedlichen Ergebnissen führen würde, wenn die Anordnungen überlappen. Wie man erwarten würde, schränkt dies deutlich die Art von Optimierungen, die durchgeführt werden können.

[soll ich beachten Sie, dass C99 ein „einschränken“ Schlüsselwort hat, das die Compiler explizit sagt, dass die Zeiger nicht überlappen. Beachten Sie auch, dass die Fortran auch hat Zeiger, mit Semantik unterscheiden sich von denen von C, aber die Zeiger sind nicht allgegenwärtig wie in C.]

Aber zurück zum C gegenüber Fortran Problem kommt, ist es denkbar, dass ein Fortran Compiler in der Lage ist, einige Optimierungen durchzuführen, die nicht möglich sein könnten, für ein (ohne weiteres geschrieben) C-Programm. Deshalb würde ich nicht allzu überrascht sein, durch den Anspruch. Allerdings glaube ich nicht erwarten, dass der Unterschied in der Leistung nicht so viel wäre. [~ 5-10%]

Jede Geschwindigkeitsunterschiede zwischen Fortran und C wird mehr eine Funktion der Compiler-Optimierungen und die zugrundeliegende Mathematik-Bibliothek durch den speziellen Compiler verwendet. Es gibt nichts intrinsisch Fortran, dass es schneller als C machen würde.

Wie auch immer, ein guter Programmierer kann Fortran schreiben in jeder Sprache.

Schnell und einfach: Beide sind gleich schnell, aber Fortran ist einfacher. Was wirklich schneller am Ende hängt von dem Algorithmus, aber es gibt erhebliche ohnehin keine Geschwindigkeitsdifferenz. Dies ist, was ich in einem Fortran-Workshop bei Hochleistungs-Rechenzentrum Stuttgard, Deutschland lernte im Jahr 2015 ich arbeiten beide mit Fortran und C und diese Meinung.

Erklärung:

C wurde entwickelt, Betriebssysteme zu schreiben. Daher hat es mehr Freiheit als Hochleistungs Code zu schreiben, benötigt. In der Regel ist dies kein Problem, aber wenn man nicht vorsichtig ist programmieren, kann man leicht den Code verlangsamen.

Fortran wurde für wissenschaftliche Programmierung entwickelt. Aus diesem Grunde unterstützt es schnell Code-Syntax weise Schreiben, da dies der Hauptzweck der Fortran ist. Im Gegensatz zur öffentlichen Meinung, ist Fortran nicht eine veraltete Programmiersprache. Seine neuesten Standard ist 2010 und neue Compiler werden in regelmäßigen Abständen veröffentlicht, da die meisten Hochleistungs-Code in Fortran writen wird. Fortran unterstützt weitere moderne Funktionen wie Compiler-Direktiven (in C Pragmas).

Beispiel: Wir wollen eine Funktion eine große Struktur als Eingabeargument geben (Fortran: Unterprogramm). Innerhalb der Funktion wird das Argument nicht verändert.

C beide unterstützt, durch Verweis aufrufen und nach Wert nennen, die eine praktische Funktion. In unserem Fall könnte der Programmierer Unfall durch Wert Verwendung Aufruf von. Dies verlangsamt die Dinge erheblich, da die Struktur zunächst in den Speicher kopiert in werden muss.

Fortran arbeitet mit Aufruf von nur als Referenz, die die Programmierer zwingt die Struktur von Hand zu kopieren, wenn er wirklich einen Anruf von Wertoperation will. In unserem Fall Fortran wird als C-Version mit Referenzaufruf automatisch so schnell sein.

Im Allgemeinen ist Fortran langsamer als C. C Hardware-Ebene Zeiger verwenden kann, so dass der Programmierer Hand-optimize. Fortran (in den meisten Fällen) haben keinen Zugriff auf Hardware-Speicheradressierung Hacks. (VAX Fortran ist eine andere Geschichte.) Ich Fortran und Ausschalten seit den 70er Jahren verwendet haben. (Really).

Doch in der Fortran-90-Start hat sich weiterentwickelt spezifische Sprachkonstrukte umfassen, die in von Natur aus parallelen Algorithmen optimiert werden können, dass können wirklich schreien auf einem Multi-Core-Prozessor. Zum Beispiel ermöglichen die automatischen Vektorisieren mehr Prozessoren jedes Element in einem Vektor von Daten gleichzeitig zu handhaben. 16 Prozessoren - 16-Element-Vektor -. Verarbeitung dauert 1 / 16tel der Zeit

In C, haben Sie Ihre eigenen Threads zu verwalten und gestalten Sie Ihren Algorithmus sorgfältig für Multi-Processing, und dann eine Reihe von API-Aufrufe, um sicherzustellen, dass die Parallelität richtig passiert.

In FORTRAN Sie nur Ihren Algorithmus entwerfen müssen sorgfältig für Multi-Processing. Der Compiler und Laufzeit den Rest für Sie verarbeiten kann.

Sie können ein wenig über Fortran , aber man viele tote Links. Du bist besser dran zu Parallel Programming Lesen (wie OpenMP.org ) und wie Fortran, dass unterstützt.

Je schneller Code ist nicht wirklich an die Sprache, ist der Compiler, so dass Sie den ms-vb „Compiler“ sehen können, die aufgeblähten erzeugt, langsamer und redundanter Objektcode, die zusammen in einem „.exe“ gebunden ist, aber Power besser erzeugt zu Art und Weise Code. Objektcode hergestellt, indem eine C und C ++ Kompilierer wird in einigen Phasen erzeugt (mindestens 2), aber nach Design meisten Fortran Compiler haben mindestens 5 Phasen, einschließlich High-Level-Optimierungen so nach Design Fortran wird immer die Fähigkeit hat, stark optimiertem Code zu generieren. So am Ende ist der Compiler nicht die Sprache, sollten Sie fragen nach, der beste Compiler ich weiß, ist der Intel Fortran Compiler, weil Sie es auf Linux und Windows zu bekommen und Sie können VS als IDE verwenden, wenn Sie für eine gesuchte billiger tigh Compiler können Sie immer auf OpenWatcom zuleiten.

Weitere Informationen dazu: http://ed-thelen.org/1401Project/1401-IBM -Systems-Journal-FORTRAN.html

Fortran hat eine bessere I / O-Routinen, z.B. die implizite tut Einrichtung Flexibilität gibt, dass die C-Standardbibliothek nicht mithalten kann.

Die Fortran-Compiler direkt behandeln die komplexeren Syntax beteiligt, und als solche Syntax nicht leicht reduziert werden zu Argumente Form vorbei, C effizient es nicht umsetzen kann.

Mit modernen Standards und Compiler, nein!

Einige der Leute hier haben vorgeschlagen, dass Fortran schneller ist, da der Compiler muss nicht über Aliasing (und somit kann mehr Annahmen bei der Optimierung machen) kümmern. Dies ist jedoch seit dem C99 (glaube ich) Standard mit der Einbeziehung des beschränken Schlüsselwort in C behandelt. Was sagt den Compiler, dass innerhalb eines gegebenen Umfangs, wird der Zeiger nicht aliased. Die Weitere ermöglicht C richtige Zeigerarithmetik, wo Dinge wie Aliasing in Bezug auf Leistung und Ressourcenallokation sehr nützlich sein können. Obwohl ich glaube, neuere Version von FORTRAN die Verwendung von „richtigem“ Zeiger ermöglichen.

Für moderne Implementierungen C allgemeinen übertrifft Fortran (obwohl es auch sehr schnell ist).

http://benchmarksgame.alioth.debian.org/u64q/fortran.html

EDIT:

Eine faire Kritik an diese scheint zu sein, dass das Benchmarking vorgespannt sein kann. Hier ist eine weitere Quelle (bezogen auf C), das Ergebnis in mehr Kontext setzt:

http://julialang.org/benchmarks/

Sie sehen, dass C Fortran typischerweise in den meisten Fällen übertrifft (wieder unten sehen, dass Kritik auch hier gelten); wie von anderen erwähnt, Benchmarking ist eine ungenaue Wissenschaft, die leicht eine Sprache über andere geladen werden kann, begünstigen. Aber es ist in Zusammenhang zu bringen, wie Fortran und C haben ähnliche Leistung.

Fortran kann Array verarbeiten, insbesondere mehrdimensionale Arrays, sehr bequem. Aufschneiden Elemente mehrdimensionales Array in Fortran kann viel einfacher sein als die in C / C ++. C ++ hat jetzt Bibliotheken die Arbeit erledigen können, wie Boost-oder Eigen, aber sie sind nach allen externen Bibliotheken. In Fortran sind diese Funktionen Eigen.

Ob Fortran schneller oder bequemer für die Entwicklung hängt vor allem von der Arbeit müssen Sie beenden. Als wissenschaftliche Berechnung Person für Geophysik, die ich am meisten Rechen in Fortran tat (ich meine moderne Fortran,> = F90).

Das ist mehr als etwas subjektiv, weil es in die Qualität von Compilern und so mehr als alles andere bekommt. Um jedoch zu mehr direkt Ihre Frage zu beantworten, von einer Sprache / Compiler Standpunkt genommen gibt es nichts über Fortran über C, die es von Natur aus schneller oder besser zu machen, als C. gehen Wenn Sie schwere mathematische Operationen tun, wird es kommen, um die Qualität des Compilers, die Fähigkeit des Programmierers in jeder Sprache und die inneren math Unterstützung Bibliotheken, die diese Operationen letztlich zu bestimmen, welche sein wird schneller für eine gegebene Implementierung unterstützen.

EDIT: Andere Leute wie @Nils haben den guten Punkt über den Unterschied bei der Verwendung von Zeigern in C und die Möglichkeit für Aliasing angehoben, die vielleicht die naiven Implementierungen langsamer in C machen Allerdings gibt es Möglichkeiten, zu behandeln über Compiler-Optimierungen und / oder in, wie die C tatsächlich geschrieben wird, dass in C99. Dies ist in @Nils Antwort und die folgenden Kommentare bedeckt, der auf seiner Antwort folgen.

Die meisten der Beiträge bereits überzeugende Argumente präsentieren, so dass ich nur die sprichwörtlich 2 Cent auf einen anderen Aspekt hinzuzufügen.

Als Fortran schneller oder langsamer in Bezug auf die Verarbeitungsleistung am Ende kann seine Bedeutung haben, aber wenn es 5-mal mehr Zeit in Anspruch nimmt, weil etwas in Fortran entwickeln:

  • es fehlt jede gute Bibliothek für Aufgaben aus reinem Zahlknirschens
  • es fehlt jedes anständiges Werkzeug für die Dokumentation und Unit-Tests
  • es ist eine Sprache mit sehr niedriger Expressivität, die Anzahl der Codezeilen sprunghaft an.
  • es hat eine sehr schlechte Handhabung von Strings
  • hat es eine alberne Menge von Fragen zwischen verschiedenen Compilern und Architekturen Sie verrückt.
  • es hat eine sehr schlechte IO-Strategie (Lesen / Schreiben von sequentiellen Dateien. Ja, Random Access-Dateien vorhanden sind, aber haben Sie jemals sehen, wie sie verwendet?)
  • es nicht ermutigen gute Entwicklungspraktiken, Modularisierung.
  • effektive Fehlen eines voll dem Standard vollständig kompatibel Open-Source-Compiler (beide gfortran und g95 unterstützen alles, was nicht)
  • sehr schlechte Kompatibilität mit C (Mangeln:. Ein Unterstrich, zwei Unterstrichen, ohne Unterstrich in der Regel ein Unterstrich aber zwei, wenn es eine andere ist unterstreichen und lassen Sie tauchen nicht in COMMON Blöcke ...)

Dann ist die Frage irrelevant. Wenn etwas langsam ist, können Sie die meiste Zeit kann es jenseits einer bestimmten Grenze nicht verbessern. Wenn Sie etwas schneller wollen, um den Algorithmus zu ändern. Am Ende ist Computer-Zeit billig. Menschen Zeit ist es nicht. Wert auf die Auswahl, die menschliche Zeit reduziert. Wenn es Computer-Zeit erhöht, ist es kostengünstiger trotzdem.

Fortran ist traditionell nicht Optionen wie -fp gesetzt: streng (die ifort einige der Funktionen in USE IEEE_arithmetic, ein Teil von F2003 Standard zu ermöglichen, erfordert). Intel C ++ auch nicht gesetzt -fp: streng als Standard, aber das ist für ERRNO Handhabung erforderlich ist, zum Beispiel, und andere C ++ Compiler macht es nicht bequem ERRNO oder Verstärkung Optimierungen wie SIMD-Reduktion auszuschalten. gcc und g ++ mich verlangt hat Makefile einzurichten mit der gefährlichen Kombination zu vermeiden O3 -ffast-math -fopenmp -march = native. Anders als diese Fragen, diese Frage über die relative Leistung wird mehr nit-picky und abhängig von lokalen Regeln über die Wahl von Compilern und Optionen.

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