Haskell Leistung bei der Verwendung von Klassen und Instanzen

9

Das Problem

Ich möchte in Haskell eine mehrwertige Ausgabe von Funktionen simulieren. Der Haskell-Code wird generiert (nicht handgeschrieben) - das sind wichtige Informationen, siehe unten:

Dies kann natürlich einfach gemacht werden, indem ein Tupel von der Funktion zurückgegeben wird, wie

%Vor%

Aber wenn ich eine solche Funktion verwende, muss ich wissen, welche Art von Tupel zurückgegeben wird:

%Vor%

Und so weiter ... Aber beim Generieren von Code weiß ich nicht, was die Art von Ausgabe ist, sagen wir, f, also benutze ich jetzt das Data.List.Select -Paket und simuliere das obige mit:

%Vor%

Das Problem ist die Leistung - in meinem Testprogramm ist die Version, die Data.List.Select verwendet, zweimal langsamer als die von Hand geschriebene Version.

Dies ist eine sehr offensichtliche Situation, weil Data.List.Select mit classes und instances geschrieben wird, also benutzt es irgendeine Art von Laufzeitwörterbuch (wenn ich nicht falsch liege). ( Ссылка )

Die Frage

Ich möchte Sie fragen, ob es möglich ist, die Version (die Data.List.Select verwendet) irgendwie so schnell zu kompilieren, wie die manuell erstellte?

Ich denke, es sollte einen Wechsel zum Compiler geben, der ihm sagt, dass er die Klassen und Interfaces für jede Verwendung "instanziieren" soll (so etwas wie Vorlagen aus C ++).

Benchmarks

Test1.hs:

%Vor%

kompilieren mit ghc -O3 Test1.hs

Test2.hs:

%Vor%

kompilieren mit ghc -O3 Test2.hs

Ergebnisse

%Vor%     
Wojciech Danilo 24.07.2013, 13:01
quelle

2 Antworten

0

Ok, die Ergebnisse, die ich gepostet habe, sind nicht korrekt - wie @sabauma sagte - die zwei Codes führen in der gleichen Zeit aus Wenn Sie sie mit aktivierten Optimierungen kompilieren.

Die Antwort von @ tohava ist sehr gut, wenn Sie explizit zeigen möchten, welche Funktionen sich spezialisieren sollen (siehe den @ sabauma-Kommentar oben).

    
Wojciech Danilo 25.07.2013, 10:23
quelle
3

Ich bin mir nicht sicher, aber es könnte sich lohnen, es zu versuchen Ссылка

    
tohava 24.07.2013 13:03
quelle