* Which function is consing? @ 2007-07-04 10:52 Joel Reymont 2007-07-04 14:12 ` [Caml-list] " Christopher L Conway 2007-07-04 14:29 ` Markus E.L. 0 siblings, 2 replies; 8+ messages in thread From: Joel Reymont @ 2007-07-04 10:52 UTC (permalink / raw) To: caml-list Folks, There's apparently no way to determine what function is consing using the profiler. How do you get around this limitation in your production code? Thanks, Joel -- http://topdog.cc - EasyLanguage to C# compiler http://wagerlabs.com - Blog ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Caml-list] Which function is consing? 2007-07-04 10:52 Which function is consing? Joel Reymont @ 2007-07-04 14:12 ` Christopher L Conway 2007-07-04 14:29 ` Jon Harrop 2007-07-04 14:29 ` Markus E.L. 1 sibling, 1 reply; 8+ messages in thread From: Christopher L Conway @ 2007-07-04 14:12 UTC (permalink / raw) To: Joel Reymont; +Cc: caml-list Joel, I'm not sure I understand you correctly, but it's highly doubtful that consing is the hotspot in your program. If you're problem is interpreting the mangled function names that show up in gprof, it's sometimes possible to correlate execution count with source locations using ocamlcp. See here: http://procrastiblog.blogspot.com/2007/04/profiling-ocaml-revealed.html This won't let you figure out "which function is consing" unless you rename ::, e.g., let mycons x xs = x :: xs Chris On 7/4/07, Joel Reymont <joelr1@gmail.com> wrote: > Folks, > > There's apparently no way to determine what function is consing using > the profiler. > > How do you get around this limitation in your production code? > > Thanks, Joel > > -- > http://topdog.cc - EasyLanguage to C# compiler > http://wagerlabs.com - Blog > > > > > > _______________________________________________ > Caml-list mailing list. Subscription management: > http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list > Archives: http://caml.inria.fr > Beginner's list: http://groups.yahoo.com/group/ocaml_beginners > Bug reports: http://caml.inria.fr/bin/caml-bugs > > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Caml-list] Which function is consing? 2007-07-04 14:12 ` [Caml-list] " Christopher L Conway @ 2007-07-04 14:29 ` Jon Harrop 0 siblings, 0 replies; 8+ messages in thread From: Jon Harrop @ 2007-07-04 14:29 UTC (permalink / raw) To: caml-list On Wednesday 04 July 2007 15:12:38 Christopher L Conway wrote: > I'm not sure I understand you correctly, but it's highly doubtful that > consing is the hotspot in your program. The garbage collector often takes 30% of the CPU but when it is taking 90% of the CPU time you want to know where all of the garbage is coming from in order to optimize away its allocation. This is typically by avoiding overly-eager recomputation or by memoizing results. I believe Joel means "allocation" when he says "consing", so he isn't just referring to list construction. To solve this problem you need to know which functions in the call tree are allocating heavily. The GC module provides the necessary statistics but (AFAIK) there are no tools to automate this for OCaml as there are for F# and other languages. So the simple solution is to wrap your functions in checks by hand and log the results. This is very tedious. Perhaps someone would like to write a camlp4 macro that wraps all top-level function definitions with memory profiling calls? So: let f x = ... is supplemented with: let f x = ... let f x = let __ = (Gc.stat()).Gc.major_words in let f_x = f x in gc_log "f" ((Gc.stat()).Gc.major_words - __); f_x How does that sound? -- Dr Jon D Harrop, Flying Frog Consultancy Ltd. The OCaml Journal http://www.ffconsultancy.com/products/ocaml_journal/?e ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Caml-list] Which function is consing? 2007-07-04 10:52 Which function is consing? Joel Reymont 2007-07-04 14:12 ` [Caml-list] " Christopher L Conway @ 2007-07-04 14:29 ` Markus E.L. 2007-07-04 14:24 ` Joel Reymont 1 sibling, 1 reply; 8+ messages in thread From: Markus E.L. @ 2007-07-04 14:29 UTC (permalink / raw) To: caml-list > Folks, > > There's apparently no way to determine what function is consing using > the profiler. > > How do you get around this limitation in your production code? I'm not sure I understand what you mean -- but if you're looking for the function call(s) generated when a::as is compiled: There is no such function AFAIK: :: is a constructor (like 'Some') not a function (like (+)) and the construction process is completely inlined (using ocaml -dinstr I see a makeblock in this instances, I assume that's it). Regards -- Markus ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Caml-list] Which function is consing? 2007-07-04 14:29 ` Markus E.L. @ 2007-07-04 14:24 ` Joel Reymont 2007-07-04 14:45 ` Bünzli Daniel 2007-07-04 16:05 ` Brian Hurt 0 siblings, 2 replies; 8+ messages in thread From: Joel Reymont @ 2007-07-04 14:24 UTC (permalink / raw) To: Markus E.L.; +Cc: caml-list What I would like to find out is how much memory each function allocates. I would like to minimize memory allocations as they put pressure on the garbage collector. This type of info is reported for Lisp functions, for example. Thanks, Joel On Jul 4, 2007, at 3:29 PM, Markus E.L. wrote: > I'm not sure I understand what you mean -- but if you're looking for > the function call(s) generated when a::as is compiled: There is no > such function AFAIK: :: is a constructor (like 'Some') not a > function (like (+)) and the construction process is completely > inlined (using > ocaml -dinstr I see a makeblock in this instances, I assume that's > it). > -- http://topdog.cc - EasyLanguage to C# compiler http://wagerlabs.com - Blog ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Caml-list] Which function is consing? 2007-07-04 14:24 ` Joel Reymont @ 2007-07-04 14:45 ` Bünzli Daniel 2007-07-04 18:19 ` Jon Harrop 2007-07-04 16:05 ` Brian Hurt 1 sibling, 1 reply; 8+ messages in thread From: Bünzli Daniel @ 2007-07-04 14:45 UTC (permalink / raw) To: caml-list You wrap your call in a higher-order function that compares the Gc.stat () before and after your call, see discussion here [1] and here [2]. This is only a half solution since it is a very manual one. However if you have a hint on where you allocate a lot this may be usefull to compare different implementations and their memory usage. Daniel [1] http://caml.inria.fr/pub/ml-archives/caml-list/ 2003/11/34f26b24813463c04244b74a889dc2a3.fr.html [2] http://caml.inria.fr/pub/ml-archives/caml-list/2003/11/ f5ceb88194f4324b692f89b6f3398ff2.fr.html ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Caml-list] Which function is consing? 2007-07-04 14:45 ` Bünzli Daniel @ 2007-07-04 18:19 ` Jon Harrop 0 siblings, 0 replies; 8+ messages in thread From: Jon Harrop @ 2007-07-04 18:19 UTC (permalink / raw) To: caml-list On Wednesday 04 July 2007 15:45:17 Bünzli Daniel wrote: > This is only a half solution since it is a very manual one. If I wrote an automatic memory profiler for OCaml, would anyone be interested in buying it for under £100? -- Dr Jon D Harrop, Flying Frog Consultancy Ltd. The OCaml Journal http://www.ffconsultancy.com/products/ocaml_journal/?e ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Caml-list] Which function is consing? 2007-07-04 14:24 ` Joel Reymont 2007-07-04 14:45 ` Bünzli Daniel @ 2007-07-04 16:05 ` Brian Hurt 1 sibling, 0 replies; 8+ messages in thread From: Brian Hurt @ 2007-07-04 16:05 UTC (permalink / raw) To: Joel Reymont; +Cc: Markus E.L., caml-list On Wed, 4 Jul 2007, Joel Reymont wrote: > What I would like to find out is how much memory each function allocates. I > would like to minimize memory allocations as they put pressure on the garbage > collector. Are you trying to track down a specific performance problem, or just trying to avoid allocation in general? If it's the former, I've had good luck just hand analyzing functions. Once you know the boxing rules, each block allocated in memory has one tag word associated with it. So if I see "x :: lst" in my code, I know that just allocated 3 words- a tag word for the list block, plus a value and a next pointer. And so on. One of the nice things about Ocaml vr.s Haskell is that this sort of analysis is much easier to do in Ocaml. If you're just trying to reduce memory allocation in general, my advice is to not bother, unless you have evidence that 1) performance isn't acceptable, 2) higher level optimizations (for example, replacing O(N^2) operations with O(N log N) operations) either cannot be applied or would be ineffective, and 3) garbage collection costs from excessive allocation is the problem. One comment I will make: it's not unusual for C/C++ programs to spend considerable amount of time allocating and deallocating objects as well, see: ftp://ftp.cs.colorado.edu/pub/techreports/zorn/CU-CS-665-93.ps.Z And note that this study does not include any overhead of deciding if an object is freeable, which Ocaml's GC does as well. C/C++ allocate and deallocate a heck of a lot less, but the cost of allocating and deallocating is a heck of a lot higher. The difference is that in Ocaml, all of these costs are reported as one big number- "hey, you're spending 30% of your time in GC!" While if you were spending 30% of your time in destructors deciding which objects can be freed yet or not, since that time is spread over a bunch of different functions, it's much less obvious. Brian ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2007-07-04 18:24 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2007-07-04 10:52 Which function is consing? Joel Reymont 2007-07-04 14:12 ` [Caml-list] " Christopher L Conway 2007-07-04 14:29 ` Jon Harrop 2007-07-04 14:29 ` Markus E.L. 2007-07-04 14:24 ` Joel Reymont 2007-07-04 14:45 ` Bünzli Daniel 2007-07-04 18:19 ` Jon Harrop 2007-07-04 16:05 ` Brian Hurt
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox