Tim Chevalier wrote:
2008/9/8 Vlad Skvortsov <[EMAIL PROTECTED]>:
Posting to cafe since I got just one reply on [EMAIL PROTECTED] I was suggested 
to
include more SCC annotations, but that didn't help. The 'serialize' function
is still reported to consume about 32% of running time, 29% inherited.
However, functions called from it only account for about 3% of time.


If "serialize" calls standard library functions, this is probably
because the profiling libraries weren't built with -auto-all -- so the
profiling report won't tell you how much time standard library
functions consume.

Hmm, that's a good point! I didn't think about it. Though how do I make GHC link in profiling versions of standard libraries? My own libraries are built with profiling support and I run Setup.hs with --enable-library-profiling and --enable-executable-profiling options.

You can rebuild the libraries with -auto-all, but probably much easier
would be to add SCC annotations to each call site. For example, you
could annotate your locally defined dumpWith function like so:

dumpWith f = {-# SCC "foldWithKey" #-} Data.Map.foldWithKey f []
    docToStr k (Doc { docName=n, docVectorLength=vl}) =
    (:) ("d " ++ show k ++ " " ++ n ++ " " ++ (show vl))

Here is how my current version of the function looks like:

serialize :: Database -> [[String]]
serialize db =
 {-# SCC "XXXCons" #-}
 [
   [dbFormatTag],
   ({-# SCC "dwDoc" #-} dumpWith docToStr dmap),
   ({-# SCC "dwTerm" #-} dumpWith termToStr tmap)
 ]
 where
   (dmap, tmap) = {-# SCC "XXX" #-} db

   dumpWith f =  {-# SCC "dumpWith" #-} Data.Map.foldWithKey f []
       docToStr :: DocId -> Doc -> [String] -> [String]

   docToStr k (Doc { docName=n, docVectorLength=vl}) =
{-# SCC "docToStr" #-} ((:) ("d " ++ show k ++ " " ++ n ++ " " ++ (show vl)))

   termToStr t il =
{-# SCC "termToStr" #-} ((:) ("t " ++ t ++ " " ++ (foldl ilItemToStr "" il)))

   ilItemToStr acc (docid, weight) =
{-# SCC "ilItemToStr" #-} (show docid ++ ":" ++ show weight ++ " " ++ acc)


...and still I don't see these cost centers to take a lot of time (they add up to about 3%, as I said before).

Then your profiling report will tell you how much time/memory that
particular call to foldWithKey uses.

By the way, using foldl rather than foldl' or foldr is almost always a
performance bug

Data.Map.foldWith key is implemented with foldr[1], however I'm not sure I'm getting how foldr is superior to foldl here (foldl' I understand). Could you shed some light on that for me please?

Thanks!

[1]: http://www.haskell.org/ghc/docs/latest/html/libraries/containers/src/Data-Map.html

--
Vlad Skvortsov, [EMAIL PROTECTED], http://vss.73rus.com

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to