2013-07-23 5 views
20

Haskell ha molti grandi strumenti per il debug runtime problemi di prestazioni, ma quali strumenti/regole di massima esiste per il debug tempo di compilazione problemi di prestazioni?Debug compilare i problemi di prestazioni causati da temporali vincolo di GHC risolutore

In particolare, il risolutore di vincoli in alcuni dei miei codici richiede sempre (da 1 a 2 secondi a diversi minuti). Sono abbastanza sicuro che ciò sia dovuto al modo in cui utilizzo le famiglie di tipi nei vincoli, ma non ho idea di che tipo di cose siano costose in questo contesto o come vedere dove il risolutore di vincoli sta spendendo il suo tempo. La mia ipotesi migliore è che una delle mie operazioni su liste di tipi sta prendendo tempo quadratico anziché lineare.

Vediamo un esempio del motivo per cui sospetto che il risolutore di vincoli. Nei miei file, Ho codice che assomiglia:

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 

Quando carico il file in ghci

ghci> :l Example.hs 

compilazione avviene molto rapidamente, meno di 1 secondo. Poi, eseguo la seguente linea:

ghci> let test = f Int :: ExampleData 

Nessun calcolo effettivo sta succedendo, ma questo richiede ancora un tempo molto lungo. Maggiore è il numero di vincoli nella dichiarazione di istanza di ExampleData, maggiore è il tempo necessario. (In realtà, la valutazione del test avviene in un secondo momento.) Il modo migliore per capire come eseguire il debug di questi problemi di prestazioni consiste nel commentare i vincoli uno alla volta e nel vedere quali causano il calo di prestazioni. Ma questo richiede molto tempo e quando questi vincoli coinvolgono famiglie di tipi complessi, non è poi così informativo.

Quindi, è possibile adottare un approccio migliore per eseguire il debug di questo problema?


Edit: Si scopre ho scoperto un bug in GHC. C'è uno script associato al bug che dimostra che il risolutore di vincoli sta prendendo tempo quadratico su input che dovrebbero essere lineari.

+0

Suppongo che tu abbia provato a compilare GHC con il profilo attivato e usando quello? –

+0

@BoydStephenSmithJr. Non ho mai compilato GHC prima, figuriamoci con la compilazione attivata. Esiste un tutorial su come utilizzare questa funzione? –

+1

[Building GHC] (http://ghc.haskell.org/trac/ghc/wiki/Building) è probabilmente una buona risorsa, e c'è anche una sezione sul benchmarking di GHC anche se non so se includa la profilazione. –

risposta

7

Per quello che vale, è possibile valutare i vincoli uno alla volta utilizzando: gentile! per vedere quanto tempo ci vuole, invece di doverli commentare singolarmente.

Problemi correlati