On Thu, Dec 1, 2011 at 4:02 PM, Mathieu Bouchard matju@artengine.ca wrote:
Le 2011-12-01 à 10:39:00, Charles Henry a écrit :
When using [*~ 0], the inlet and outlet are borrowed. The scalar multiply operation is performed in place and no data transfer occurs.
What do you call « data transfer » ? multiplying in place by a constant involves as many reads and writes as doing a (single) copy. This at least needs to stream data from the highest-speed RAM to the CPU and back. It's less noticeable than the copy time of very large buffers (e.g. [table] or [pix_separator]) because those really need big RAM (which is slower), but in any case, calling scalartimes_perf8 (or whatever) means an implicit copy in some kind of way, just like nearly anything else does.
You make a good point--I wasn't counting the data transfer that occurs between registers or the way that the compiler breaks out the steps involved, and of which I am mostly ignorant.
The part I was differentiating from: there's significant data transfer operations that has to do with switch~. The inlet~ inside a subpatch and outlet on the parent from canvases using switch~ have signals that aren't borrowed. This means there's another data transfer (a copy) between signals on the parent and the sub-canvas.
So, using switch~ as in Roman's example involves 2 copy operations on the signals. Is that what we're seeing? I'm not sure how to count the operations--and how to compare the scalartimes perform routines vs inlet_doprolog/inlet_dsp and outlet_dsp/outlet_doepilog (which I'm contending is the difference we're seeing in the performance numbers).
Chuck