Profiling graph library

bearophile bearophileHUGS at lycos.com
Wed Jul 31 05:31:05 PDT 2013


Joseph Rushton Wakeling:

> No, gdmd -O -release -inline -g -profile, and then gprof to 
> generate the profile.

Then I suggest to try ldc2 too.


> That's what I'd assumed, which was why I was so disappointed 
> that in this case
> performance was _very_ bad.  I particularly don't understand 
> the major GC hit.
>
> Or rather, I should say, I don't see why that GC hit should be 
> there, unless
> it's that there is a fault in the implementation of iota, map 
> and/or chain.

My suggestion is to copy the implementation of those ranges in a 
test module, and try to understand what are the causes of the GC 
activity you see.


> Could you expand a little on that point?
>
> I don't mean to ask you to write my code for me, it's just that 
> (like most
> non-computer-science researchers) my knowledge of programming 
> is somewhat
> specialized, and there are blank spots on the map.  So when in 
> your reply to
> John you say, "Allocate a buffer somewhere, on the stack or 
> heap", I'm still not
> sure exactly what you mean or how you'd use it.  It'd really 
> help to see a
> concrete example (it doesn't need to be tailored to the 
> use-case here).

If this resulting array is used only for a short period of time:

return sequence.map!(x => x.func).array;


then perhaps you can perform an array allocation in a 
constructor, static constructor, or you could allocate a fixed 
sized array inside the body of the graph, etc. Let's say this 
array is named "buf".

Then with code like:

auto left = sequence.map!(x => x.func).copy(buf[]);
return buf[...];

left tells you how much is left, so you can slice the buf and 
return it. Somewhere you also have to safe the length of the used 
buf.
If the resulting array is used only for a moment, this will not 
cause troubles in a single thread program. The point is to remove 
the memory allocation caused by array().

An alternative design comes from Tango, instead of allocating the 
buffer somewhere, your function takes an optional buffer, and 
uses it unless it's too much small for the purpose, otherwise it 
allocates with array() or something else.

Bye,
bearophile


More information about the Digitalmars-d-learn mailing list