2013-07-23 6 views
20

Haskell viele großartige Werkzeuge für das Debugging Laufzeit Performance-Probleme hat, aber welche Werkzeuge/Faustregeln existieren Kompilierung Performance-Probleme für das Debuggen?Debugging Zeit Performance-Probleme verursacht durch Einschränkung des GHC kompilieren Solver

Insbesondere dauert der Constraint Solver in einigen meiner Code für immer (irgendwo von 1-2 Sekunden bis zu mehreren Minuten). Ich bin mir ziemlich sicher, dass dies daran liegt, wie ich Typfamilien in den Constraints verwende, aber ich habe keine Ahnung, welche Art von Dingen in diesem Kontext teuer ist oder wie man sieht, wo der Constraint-Solver seine Zeit verbringt. Meine beste Vermutung ist, dass eine meiner Operationen auf Typlisten quadratische Zeit anstelle von linearer Zeit verwendet.

Lassen Sie uns ein Beispiel sehen, warum ich den Constraint Solver vermute. In meiner Dateien habe ich Code, der wie folgt aussieht:

class ExampleClass a where 
    type ExampleType a 
    f :: ExampleType a -> a 

data ExampleData (xs :: [a]) = ... 

instance 
    (Constraint1 
    , Constraint2 
    , ... 
    ) => ExampleClass (ExampleData xs) 
     where 
    type ExampleType (ExampleData xs) = Int 
    f = undefined 

Wenn ich laden diese Datei in GHCI

ghci> :l Example.hs 

Zusammenstellung sehr schnell geschieht, viel weniger als 1 Sekunde. Dann ausführen ich die folgende Zeile:

ghci> let test = f Int :: ExampleData 

keine tatsächliche Berechnung los ist, aber das dauert noch eine sehr lange Zeit. Je mehr Einschränkungen in der Instanzdeklaration von ExampleData, desto länger dauert es. (Der eigentliche Test wird später sofort durchgeführt.) Der beste Weg, wie ich diese Performance-Probleme debuggen kann, besteht darin, Constraints einzeln zu kommentieren und zu sehen, welche den Performance-Hit verursachen. Aber das ist sehr zeitaufwändig, und wenn diese Einschränkungen komplexe Typenfamilien betreffen, ist es nicht wirklich informativ.

Also, gibt es einen besseren Ansatz, den ich nehmen kann, um dieses Problem zu debuggen?


Edit: Es stellt sich heraus, dass ich eine bug in GHC entdeckt. Dem Fehler ist ein Skript zugeordnet, das zeigt, dass der Beschränkungslöser bei Eingaben, die linear sein sollten, eine quadratische Zeit benötigt.

+0

Ich nehme an, Sie haben versucht, GHC mit Profiling eingeschaltet und das zu verwenden? –

+0

@BoydStephenSmithJr. Ich habe GHC noch nie kompiliert, geschweige denn das Kompilieren eingeschaltet. Gibt es ein Tutorial zur Verwendung dieser Funktion? –

+1

[Building GHC] (http://ghc.haskell.org/trac/ghc/wiki/Building) ist wahrscheinlich eine gute Ressource, und es gibt sogar einen Abschnitt zum Benchmarking von GHC, obwohl ich nicht weiß, ob es Profiling beinhaltet. –

Antwort

7

Für das, was es wert ist, können Sie Einschränkungen nacheinander mit: kind! um zu sehen, wie lange es dauert, anstatt sie einzeln auskommentieren zu müssen.