9

Sto scrivendo un modulo che si basa sull'ottimizzazione. Voglio testare questo modulo in ghci. Ma l'avvio di ghc nella modalità --interactive disabilita automaticamente l'ottimizzazione; se compilo il modulo con -O e poi provo a caricarlo in una sessione interattiva, ghc insiste sul caricamento in modalità interpretata.Come posso caricare il codice ottimizzato in GHCI?

Per un semplice caso di test per distinguere moduli ottimizzati e non ottimizzate, isOptimized seguito viene valutato come True con l'ottimizzazione, ma False con ottimizzazione off:

isOptimized :: Bool 
isOptimized = g 

g :: Bool 
g = False 

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

risposta

12

usare sia ghci -fobject-code -O Test.hs o cabal repl --ghc-options="-fobject-code -O". In dettaglio:

  1. ghci deve essere richiamato con il -fobject-code flag. deve essere dato

  2. bandiera Optimization (s) dopo-fobject-code sulla linea di comando, o in un pragma OPTIONS_GHC nella parte superiore del modulo. Provare ghc --interactive -O -fobject-code produce un avviso che "-O è in conflitto con --interactive; -O ignorato." Questo è forse un bug.

  3. Se stai lavorando su un progetto cabalized e utilizzando cabal repl, è necessario passare le bandiere sia sulla linea di comando (cioè cabal repl --ghc-options="-fobject-code -O") o in un pragma. Cabal (al momento) scarta i flag di ottimizzazione impostati nel file .cabal con ghc-options quando si richiama ghci; infatti, imposta esplicitamente -O0. Questo è forse un bug.

Nota in ogni caso a volte è necessario forzare la ricompilazione manualmente quando si passa dalla modalità ottimizzata a quella non ottimizzata. Gli artefatti di build, per qualche motivo, non vengono invalidati quando i flag di ottimizzazione cambiano fino a quando rimane attivo -fobject-code. Se, partendo da una tabula rasa, hai impostato -fobject-code nel tuo file .cabal, esegui cabal repl che compila il modulo, e poi ricorda che è necessario impostare -O sulla riga di comando ed eseguire cabal repl --ghc-options=-O, ghc caricherà felicemente la compilazione precedente , modulo non ottimizzato. Anche questo è forse un bug.

Lo scenario più affidabile per testare un singolo modulo sembra essere quello di inserire {-# OPTIONS_GHC -fobject-code -O #-} nella parte superiore del modulo. Otterrai un codice ottimizzato indipendentemente da come invochi ghci. Non ho indagato su cosa succede in situazioni multi-modulo dove alcuni ma non tutti i moduli hanno il pragma.

Per inciso, notare che solo il codice nel modulo è ottimizzato. Anche con l'ottimizzazione attivata, la valutazione di g nel repl produce sempre False, poiché l'input repl non è soggetto alle regole di riscrittura.

+0

Quindi mi sembra che questo potrebbe essere un modo per svolgere effettivamente le funzioni temporali e misurare approssimativamente le prestazioni tramite GHCi. Tu o qualcuno può approvare o disapprovare? – MasterMastic

+0

@ChristianConkle hai visto questo argomento? http://stackoverflow.com/questions/27541609/difference-in-performance-of-compiled-accelerate-code-ran-from-ghci-and-shell –

+0

@WojciechDanilo - Sì. Ho appena postato un commento lì. (Non credo di poterti notificare in quell'argomento perché non hai ancora commentato.) –