2015-03-18 9 views
5

Ich versuche, mein Programm mit SCC (Set Cost Center) -Anmerkungen zu profilieren. Was ist der beste Weg herauszufinden, wie lange es dauert, bis eine Monade durch eine do-Anweisung ausgeführt wird? (Es ist illegal, eine SCC-Anweisung in einem do-Block zu setzen.) Mit anderen Worten, lassen Sie uns sagen, ich habe:Die beste Art, "Kostenstelle" an eine Monade anzuhängen (Haskell)

do 
    x <- computeStuff 
    y <- computeStuff 
    return (x + y) 

Wie kann ich die Gesamtausführungszeit für die beiden computeStuff und der x + y (statt der finden Bauzeit der Monade)?

Antwort

3

SCCs können für jeden Ausdruck festgelegt werden. (do { ... }) ist ein gültiger Ausdruck. So ist computeStuff und return (x + y). Das einzige, was hier kein Ausdruck ist, ist x <- computeStuff. Sie sagen, Sie wollen die Gesamtzeit, die ich verstehe, die Gesamtzeit für den gesamten Do-Block. Aber Sie können SCCs überall im Do-Block platzieren. Zum Beispiel ist das folgende vollkommen gültig.

computeStuff :: IO Int 
computeStuff = return 0 

test = {-# SCC "total" #-} (
    do 
    x <- {-# SCC "x" #-} computeStuff 
    y <- {-# SCC "y" #-} computeStuff 
    return $ {-# SCC "x+y" #-} (x + y) 
) 
+3

Wird das Profil die tatsächliche * Ausführung * der Aktion und nicht nur die * Konstruktion * sein? –