[Haskell-cafe] Undocumented cost-centres (.\) using auto-all, and SCC pragma not being honored
Dan Maftei
ninestraycats at gmail.com
Thu Feb 16 13:34:56 CET 2012
On Wed, Feb 15, 2012 at 9:51 PM, Thomas Schilling
<nominolo at googlemail.com>wrote:
> On 15 February 2012 16:17, Dan Maftei <ninestraycats at gmail.com> wrote:
> >
> > 1 When profiling my code with -auto-all, my .prof file names some
> sub-expressions with a backslash. Cf. below. What are these?
> >
> > e_step
> > e_step.ewords
> > e_step.\
> > e_step.\.\
> > e_step.update_counts
> > e_step.fwords
> >
>
> Yup, those are anonymous functions.
>
Thank you. I'm still curious why other (named) expressions don't show up.
I'm running the profiler again now and they DO. Odd...
>
> >
> > 2. A related question: I tried using the SCC pragma instead of auto-all.
> I added it to all seven expressions inside the let, and to the nested
> folds. However, only two showed up in the .prof file! How come?
>
> It would be helpful if you pasted the code. I think SCC pragmas
> around lambdas get ignored and you should put them inside. (It may be
> the other way around, though.)
God this is embarrassing... it's horrible code, I don't know monads yet
and EM makes more sense in an imperative paradigm, but I felt like pushing
the envelope and failed miserably lol. Anyways:
e_step ttable (fsentence, esentence) (counts, totals) =
let
ewords = {-# SCC "ewords" -#} T.words esentence
fwords = {-# SCC "fwords" -#} T.words fsentence
-- calculate s-total(e) map
sTotal = {-# SCC "sTotal" -#} foldr (update_sTotal fwords) M.empty
ewords
update_sTotal fwords e sTotal = {-# SCC "update_sTotal" -#}
foldr (\f sTotal ->
M.insertWith (+) e (getProb f e ttable) sTotal)
sTotal fwords
-- helpers for updating counts
update_counts counts e f sTotal = {-# SCC "update_counts" -#}
let !adding = (getProb f e ttable) / (sTotal M.! e)
in M.insertWith (M.unionWith (+)) f (M.singleton e adding) counts
update_totals totals e f sTotal = {-# SCC "update_totals" -#}
let !adding = (getProb f e ttable) / (sTotal M.! e)
in M.insertWith' (+) f adding totals
in {-# SCC "folds" -#}
-- update counts by iterating over words
foldr (\f (!counts, !totals) ->
foldr (\e (!counts, !totals) ->
let !newCounts = update_counts counts e f sTotal
!newTotals = update_totals totals e f sTotal
in (newCounts, newTotals))
(counts, totals) ewords)
(counts, totals) fwords
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20120216/03972616/attachment.htm>
More information about the Haskell-Cafe
mailing list