Ich bin gespannt, wie die F # -Leistung mit der C ++ - Leistung verglichen wird.
Variiert stark je nach Anwendung. Wenn Sie in einem Multithread-Programm in großem Umfang ausgefeilte Datenstrukturen verwenden, ist F # wahrscheinlich ein großer Gewinn. Wenn Sie die meiste Zeit in engen numerischen Schleifen verbringen, die Arrays mutieren, ist C ++ möglicherweise 2-3 × schneller.
Fallstudie: Ray Tracer Mein Benchmark verwendet hier einen Baum für hierarchisches Keulen und numerischen Ray-Sphere-Schnittcode, um ein Ausgabebild zu generieren. Dieser Benchmark ist mehrere Jahre alt und der C ++ - Code wurde im Laufe der Jahre Dutzende Male verbessert und von Hunderttausenden von Menschen gelesen. Don Syme von Microsoft hat es geschafft, eine F # -Implementierung zu schreiben, die etwas schneller als der schnellste C ++ - Code ist, wenn sie mit MSVC kompiliert und mit OpenMP parallelisiert wird.
Ich habe gelesen, dass F # skalierbarer und leistungsfähiger sein soll, aber wie ist diese reale Leistung im Vergleich zu C ++?
Das Entwickeln von Code ist mit F # viel einfacher und schneller als mit C ++. Dies gilt sowohl für die Optimierung als auch für die Wartung. Wenn Sie mit der Optimierung eines Programms beginnen, führt der gleiche Aufwand zu viel größeren Leistungssteigerungen, wenn Sie F # anstelle von C ++ verwenden. F # ist jedoch eine übergeordnete Sprache und legt folglich eine niedrigere Obergrenze für die Leistung fest. Wenn Sie also unendlich viel Zeit für die Optimierung haben, sollten Sie theoretisch immer in der Lage sein, schnelleren Code in C ++ zu erstellen.
Dies ist genau der gleiche Vorteil, den C ++ gegenüber Fortran und Fortran gegenüber handgeschriebenen Assemblern hatte.
Fallstudie: QR-Zerlegung Dies ist eine grundlegende numerische Methode aus der linearen Algebra, die von Bibliotheken wie LAPACK bereitgestellt wird. Die Referenz-LAPACK-Implementierung umfasst 2.077 Zeilen Fortran. Ich habe eine F # -Implementierung in weniger als 80 Codezeilen geschrieben, die das gleiche Leistungsniveau erreicht. Die Referenzimplementierung ist jedoch nicht schnell: Vom Hersteller optimierte Implementierungen wie Intels Math Kernel Library (MKL) sind häufig zehnmal schneller. Bemerkenswerterweise konnte ich meinen F # -Code weit über die Leistung der Intel-Implementierung hinaus optimieren , die auf Intel-Hardware ausgeführt wird, während mein Code unter 150 Codezeilen und vollständig generisch gehalten wurde (er kann einfache und doppelte Genauigkeit sowie komplexe und sogar symbolische Matrizen verarbeiten!): Für große, dünne Matrizen ist mein F # -Code bis zu 3 × schneller als der Intel MKL.
Beachten Sie, dass die Moral dieser Fallstudie nicht darin besteht, dass Sie erwarten sollten, dass Ihre F # schneller ist als von Anbietern optimierte Bibliotheken, sondern dass selbst Experten wie Intel produktive Optimierungen auf hoher Ebene verpassen, wenn sie nur Sprachen auf niedrigerer Ebene verwenden. Ich vermute, Intels Experten für numerische Optimierung haben die Parallelität nicht vollständig ausgenutzt, weil ihre Tools sie extrem umständlich machen, während F # sie mühelos macht.
Wie gut macht es Gleitkomma?
Die Leistung ist ähnlich wie bei ANSI C, einige Funktionen (z. B. Rundungsmodi) sind in .NET jedoch nicht verfügbar.
Erlaubt es Vektoranweisungen
Nein.
Wie freundlich ist es, Compiler zu optimieren?
Diese Frage macht keinen Sinn: F # ist eine proprietäre .NET-Sprache von Microsoft mit einem einzigen Compiler.
Wie groß ist der Speicherbedarf?
Eine leere Anwendung verwendet hier 1,3 MB.
Ermöglicht es eine fein abgestimmte Kontrolle über die Speicherlokalität?
Besser als die meisten speichersicheren Sprachen, aber nicht so gut wie C. Beispielsweise können Sie beliebige Datenstrukturen in F # entpacken, indem Sie sie als "Strukturen" darstellen.
Hat es Kapazität für verteilte Speicherprozessoren, zum Beispiel Cray?
Kommt darauf an, was du mit "Kapazität für" meinst. Wenn Sie .NET auf diesem Cray ausführen können, können Sie die Nachrichtenübergabe in F # verwenden (genau wie in der nächsten Sprache), aber F # ist hauptsächlich für Desktop-Multicore-x86-Computer vorgesehen.
Welche Funktionen können für die Computerwissenschaft von Interesse sein, wenn es um die Verarbeitung schwerer Zahlen geht?
Speichersicherheit bedeutet, dass Sie keine Segmentierungsfehler und Zugriffsverletzungen erhalten. Die Unterstützung für Parallelität in .NET 4 ist gut. Die Möglichkeit, Code im laufenden Betrieb über die interaktive F # -Sitzung in Visual Studio 2010 auszuführen, ist für interaktives technisches Computing äußerst nützlich.
Gibt es tatsächliche wissenschaftliche Computerimplementierungen, die diese verwenden?
Unsere kommerziellen Produkte für das wissenschaftliche Rechnen in F # haben bereits Hunderte von Benutzern.
Ihre Fragestellung zeigt jedoch, dass Sie wissenschaftliches Rechnen als Hochleistungsrechnen (z. B. Cray) und nicht als interaktives technisches Rechnen (z. B. MATLAB, Mathematica) betrachten. F # ist für Letzteres vorgesehen.