Die beiden folgenden Haskell-Funktionen scheinen sich nur dadurch zu unterscheiden, ob die Indexvariable implizit oder explizit ist, aber der Unterschied in der Leistung um zwei Größenordnungen ist.GHC-Optimierung
Diese Funktion dauert etwa 0,03 Sekunden MFI B berechnen 30:
let mfib = (map fib [0..] !!)
where
fib 0 = 0
fib 1 = 1
fib x = mfib (x-1) + mfib (x-2)
Diese Funktion nimmt ca. 3 Sekunden für MFI B 30:
let mfib i = map fib [0..] !! i
where
fib 0 = 0
fib 1 = 1
fib x = mfib (x-1) + mfib (x-2)
Ich vermute, es hat mit GHC inline zu tun Regeln und haben versucht, inline/noinline Pragmas hinzuzufügen, um eine übereinstimmende Leistung zu erhalten.
EDIT: Ich verstehe, wie ein Nachschlagen in die faule Liste verwendet werden kann, um die Fib-Funktion zu memotisieren und warum die traditionelle Definition von fib sehr langsam ist. Ich habe erwartet, dass die Memoisierung sowohl in der zweiten als auch in der ersten Funktion funktioniert und nicht versteht, warum dies nicht der Fall ist.
Der Schlüssel ist * Memoisierung *. Siehe [hier] (http://stackoverflow.com/questions/11466284/how-is-this-fibonacci-function-memoized). –