[PD] Findings regarding performance

Charles Henry czhenry at gmail.com
Thu Dec 1 17:39:27 CET 2011

On Thu, Dec 1, 2011 at 10:09 AM, Mathieu Bouchard <matju at artengine.ca> wrote:
> Le 2011-12-01 à 15:24:00, Roman Haefeli a écrit :
>> reason, let's just use an invented arbitrary unit for expressing the CPU
>> time (ct) consumed by an object. It turned out that [gate~] uses 0.52ct
>> when it is on and 0.4ct when it is off. But how much does [*~ ] use? No
>> matter whether turned on or off, [*~ ] uses a stable 0.39ct.
> Even though [switch~] does not use tight conditionals, instead checking only
> once per block, it still takes some time copying stuff and switching
> contexts. I suppose that this is the kind of thing that Pd could do more
> efficiently than it does now, if someone is brave enough to edit d_ugen.c...
> and knows how to do it.

For further explanation:  In an abstraction where the block sizes
match and there's no switch~, signals are borrowed from the parent
context.  When switch~ is used, inlet~ and outlet~ signals are not
borrowed, even when block sizes match.

block_prolog handles the switch~ behavior, returning a pointer to the
end of the block epilog when switched off.  This comes before data is
copied into buffers in inlet_doprolog.

On the outlet~, there is an un-borrowed signal allocated, and I think
it's also assigned to be zero when switched off.  This would be the
only major point where an assignment operation occurs.

When using [*~ 0], the inlet and outlet are borrowed.  The scalar
multiply operation is performed in place and no data transfer occurs.

It's all relatively fresh in my mind, but I need a good week's
vacation to re-focus and study d_ugen.c some more.  I've done enough
to understand what's in there, but I've rarely asked the question how
to make it work better.

More information about the Pd-list mailing list