On Wed, 25 Feb 2009, Enrique Erne wrote:

... and i thought my list-drip-custom would win :( could somebody explain how it exaclty works?

well, first, the right-inlet of [list] makes a copy of your list, so this makes it take a lot more time when cutting lists into pieces.

second, the left-inlet of [list] also makes a copy of your list, so this makes it take double the time that it just added, because [list] is a [list append], and it's appending a bang to a list, and a bang is an empty list, and it's not smart enough to skip the copy in that case.

this makes a regular list-drip make n*n atom copies, whereas when you cut in chunks of 64, it makes n*n/64 atom copies, and then it makes 64*64*(n/64) = 64*n atom copies with the rest, almost.

this also means that your recursion and [until] run at the same speed because they end up making the same copies, so you could achieve the same results with two levels of [until].

you can achieve more speed by adding extra levels of [until] and tuning the list chunk sizes for each level.

then also if you use a pair of [list split]s and a counter to iterate through it, you have to use a [list] to hold it, and then it takes n*n steps because it's an append, and if you try to use [textfile] or a settable messagebox, it also copies because it's doing comma-expansion, so it's no better (note that [textfile] is very much like an invisible messagebox, there's no real parsing involved unless you load from a real file)

so i figured out that I had to use [list split] with recursion without [list], so that it doesn't copy the sublists. but then, attempting to do it will output the elements in reverse order, so you have to use two [list split]s, which only copies n atoms (the absolute minimum).

then, doing it with one or two [list split]s gets you a stack overflow very soon, so by recursing over half-lists you can use up only log(n)/log(2) levels of recursion. this only copies n atoms, so it's the minimum possible.

when doing recursion, you have to be careful because pd's cold-inlets interfere with normal use of recursion... so, for example, I had to compute the half-list-size twice because I had two [list split]s.

there are several ways in which pd falls just short of allowing a simple way. For example, just a simple [repeat] with a counter would be several times less objects, cords and tricks, and can be somewhat speedier than [list-drip-quick] because you can avoid a lot of the other things that [list-drip-quick] has to do besides copying n atoms.

Actually, I just tried it with [repeat], and, the way I did it, it is consistently 2.9 times faster than [list-drip-quick].

But from the moment that you get it down to n atom copies, the speed differences don't tend to matter nearly as much, as the objects that receive the dripping will have to process n messages, and that is often taking more time than the splitting.

So, a pure C external version of [list-drip] may be still several times faster than the [repeat] version, but only as long as you don't send its output to any object at all! In real-life situations, the speed difference is much thinner than the benchmarks, when the objects being benchmarks are both quite fast.

Note that it's possible that adding to a messagebox cancels all speed improvements. Its running-time is either n copies or n*n/2 copies, because it's using a realloc, which may copy or not, depending on whether you're lucky.

what license do you publish your code when you post code on the pd-list? same as puredata?

yes, SIBSD license. well, it's on a case-by-case basis. there's no automatic license for anything, but let's say that [list-drip-quick] is SIBSD.

 _ _ __ ___ _____ ________ _____________ _____________________ ...
| Mathieu Bouchard - tél:+1.514.383.3801, Montréal, Québec
_______________________________________________
Pd-list@iem.at mailing list
UNSUBSCRIBE and account-management -> 
http://lists.puredata.info/listinfo/pd-list

Reply via email to