Ich habe versucht, das erste Beispiel hier zu starten: Ссылка
Code: Ссылка
%Vor%Ich habe mit ghc 7.10.2 (auf OSX, mit einem Multicore-Rechner) mit dem folgenden Befehl gebaut:
%Vor%Und renne mit:
%Vor% Ich habe erwartet, dass die 2 fibs
-Berechnungen parallel laufen (vorherige Kapitelbeispiele haben wie erwartet funktioniert, also keine Setup-Probleme), und ich habe überhaupt keine Beschleunigung bekommen, wie hier zu sehen ist:
-N1
erhält ähnliche Ergebnisse (weggelassen).
Die Anzahl der GC-Sammlungen schien misstrauisch zu sein, wie von anderen in # haskell-anfängern gezeigt wurde, also habe ich versucht, -A16M
hinzuzufügen, wenn ich renne. Die Ergebnisse sahen viel mehr im Rahmen der Erwartungen aus:
Die Frage ist: Warum ist das das Verhalten? Selbst bei häufigem GC erwarte ich immer noch intuitiv, dass die 2 Funken in den anderen 90% der Laufzeit parallel laufen.
Ja, das ist ein Fehler in GHC 8.0.1 und früher (ich arbeite daran, es für 8.0.2 zu beheben). Das Problem ist, dass die fib 35
und fib 36
-Ausdrücke konstant sind und GHC sie als CAFs auf die oberste Ebene hebt, und die RTS nahm fälschlicherweise an, dass die CAFs nicht erreichbar waren und so die Funken sammeln.
Sie können umgehen, indem Sie die Ausdrücke nicht konstant machen, indem Sie Parameter in der Befehlszeile übergeben:
%Vor% und führen Sie das Programm dann mit ./strat 35 36
.
Tags und Links haskell garbage-collection