9

Piszę moduł, który polega na optymalizacji. Chcę przetestować ten moduł w ghci. Ale uruchomienie ghc w trybie --interactive automatycznie wyłącza optymalizację; Jeśli skompiluję moduł przy pomocy -O, a następnie spróbuję załadować go w sesji interaktywnej, to wymaga on załadowania go w trybie zinterpretowanym.Jak mogę załadować zoptymalizowany kod w GHCI?

Dla prostego testu odróżnienia zoptymalizowane i niezoptymalizowanych modułów isOptimized poniżej ocenia się True z optymalizacji, ale False z optymalizacją wolnego:

isOptimized :: Bool 
isOptimized = g 

g :: Bool 
g = False 

{-# NOINLINE g #-} 
{-# RULES "g/True" g = True #-} 

Odpowiedz

12

albo stosować ghci -fobject-code -O Test.hs lub cabal repl --ghc-options="-fobject-code -O". Bardziej szczegółowo:

  1. ghci należy wywołać za pomocą -fobject-code flag.

  2. Optymalizacja flag (y) musi być podana po-fobject-code na linii polecenia lub w pragmie OPTIONS_GHC w górnej części modułu. Próbowanie ghc --interactive -O -fobject-code generuje ostrzeżenie, że "-O koliduje z --interaktywnym; -O ignorowane." To prawdopodobnie błąd.

  3. Jeśli pracujesz na cabalized projektu i stosując cabal repl, trzeba przekazać flagi albo w linii poleceń (tj cabal repl --ghc-options="-fobject-code -O") lub w Pragma. Cabal (obecnie) odrzuca flagi optymalizacyjne ustawione w pliku .cabal z ghc-options podczas wywoływania ghci; w rzeczywistości zamiast tego wyraźnie ustawia -O0. To prawdopodobnie błąd.

Należy pamiętać, że czasami trzeba ręcznie wymusić ponowną kompilację podczas przełączania między trybem zoptymalizowanym i nieoptymalizowanym. Zbuduj artefakty z jakiegoś powodu nie są unieważniane, gdy flagi optymalizacji zmieniają się tak długo, jak długo pozostaje -fobject-code. Jeśli, zaczynając od czystej karty, masz -fobject-code ustawiony w pliku .cabal, uruchom cabal repl, który kompiluje moduł, a następnie pamiętaj, że musisz ustawić -O w wierszu poleceń i uruchomić cabal repl --ghc-options=-O, ghc z przyjemnością załaduje wcześniej skompilowane , nieoptymalizowany moduł. Jest to prawdopodobnie również błąd.

Najbardziej wiarygodnym scenariuszem testowania pojedynczego modułu wydaje się być umieszczenie {-# OPTIONS_GHC -fobject-code -O #-} u góry modułu. Otrzymasz zoptymalizowany kod bez względu na to, w jaki sposób powołujesz się na ghci. Nie badałem, co dzieje się w wielomodułowych sytuacjach, w których niektóre, ale nie wszystkie moduły mają pragmę.

Nawiasem mówiąc, zoptymalizowano tylko kod w module. Nawet przy włączonej optymalizacji ocena g w replice zawsze będzie generować False, ponieważ dane wejściowe replik nie podlegają przepisywaniu od nowa.

+0

Wydaje mi się, że może to być sposób na sprawdzenie czasu funkcji i przybliżenie wyników przez GHCi. Czy ty lub ktokolwiek możesz zatwierdzić lub odrzucić? – MasterMastic

+0

@ChristianConkle widziałeś ten temat? http://stackoverflow.com/questions/27541609/difference-in-performance-of-compiled-accelerate-code-ran-from-ghci-and-shell –

+0

@WojciechDanilo - Tak. Właśnie napisałem komentarz. (Nie sądzę, że mogę @ powiadomić Cię w tym temacie, ponieważ nie skomentowałeś jeszcze.) –