2015-06-08 13 views
9

Per il meccanismo di modello Hamlet, comprendo che il modello viene analizzato in fase di compilazione, con conseguente codice sorgente che contiene chiamate a combinatori blaze-html (ed eventualmente altre espressioni perché di interpolazione). Quindi i punti (sottoalberi) in cui avviene l'interpolazione sono noti in fase di compilazione.costi di compilazione rispetto al tempo di esecuzione dei modelli di Hamlet

In fase di esecuzione, è necessario calcolare il valore interpolato (ovviamente), e "plug it" nell'albero, ovvero applicare i combinatori html. Tutti loro? In realtà alcune di queste applicazioni potrebbero essere valutate in fase di compilazione (quelle che non hanno interpolazione sotto di loro). Questo succede?

risposta

7

E 'stato un po' di tempo da quando ho lavorato al codice, quindi non prendere questo come autorevole (come menzionato Daniel, -ddump-simpl è una buona chiamata qui). Ma non credo che stiamo usando i combinatori di blaze-html, solo il tipo di dati. Hamlet stesso concatena stringhe il più possibile al momento della compilazione per evitare quel costo in fase di runtime. So che quando ho effettuato l'ultimo benchmark (che è stato concesso anni fa), l'ottimizzazione ha dato ottimi risultati.

5

Probabilmente no: quello che stai chiedendo sembra molto simile alla valutazione parziale (da non confondere con l'applicazione parziale), che è un po 'un campo minatore compilatore-performance, quindi spesso evitato. Ma puoi controllare tu stesso; utilizzare -ddump-simpl con il livello di ottimizzazione preferito per visualizzare il nucleo generato da GHC.

+0

Si noti che si tratta di compilazione-tempo, ma non del compilatore (ghc's simplificator). Stiamo eseguendo codice haskell modello che può fare semplificazioni specifiche del dominio (e lo fa, vedere l'esempio di seguito). – d8d0d65b3f7cf42

3

come dice Michael "Amleto concatena stringhe il più possibile al momento della compilazione per evitare che il costo in fase di esecuzione."

Per l'esempio dal libro,

main = putStrLn $ renderHtml [shamlet| 
<p>Hello, my name is #{name person} and I am #{show $ age person}. 
<p> 
    Let's do some funny stuff with my name: # 
    <b>#{sort $ map toLower (name person)} 
<p>Oh, and in 5 years I'll be #{show ((+) 5 (age person))} years old. 
|] 
    where 
    person = Person "Michael" 26 

-ddump-simpl contiene questo:

   (>> 
        @ Text.Blaze.Internal.MarkupM 
        Text.Blaze.Internal.$fMonadMarkupM 
        @() 
        @() 
        (id 
        @ (Text.Blaze.Internal.MarkupM()) 
        (. @ Data.Text.Internal.Text 
         @ Text.Blaze.Internal.Markup 
         @ String 
         Text.Blaze.Internal.preEscapedText 
         Data.Text.pack 
         (GHC.CString.unpackCString# 
          ".</p>\n\ 
          \<p>Let's do some funny stuff with my name: <b>"#))) 

In effetti, non è l'albero di sintassi del HTML (ultima riga - la stringa contiene un tag di chiusura e il prossimo tag di apertura).

Questa funzione di Hamlet dovrebbe essere pubblicizzata di più!

Problemi correlati