> I like the research!  Can you do a test where there are lots and lots
> of sprites, but that only a few have the handler? Compare that
> against there only being those few sprites.

Ah. I'm glad you asked. I did do some more tests, actually.

I modified the original movie script:

--------------------
global gCounter

-- consecutive sprites
on test(sprLow, sprHigh)
  testMax = 10000

  gCounter=0
  t=the milliseconds
  repeat with j=1 to testMax
    sendAllsprites(#doit)
  end repeat

  put the milliseconds-t
  put gCounter

  gCounter=0
  t=the milliseconds
  repeat with j=1 to testMax
    repeat with i = sprLow to sprHigh
      sendsprite(i, #doit)
    end repeat
  end repeat

  put the milliseconds-t
  put gCounter
END test


-- unevenly distributed sprites
on otherTest aList
  testMax = 10000

  gCounter=0
  t=the milliseconds
  repeat with j=1 to testMax
    sendAllsprites(#doit)
  end repeat

  put the milliseconds-t
  put gCounter

  gCounter=0
  t=the milliseconds
  repeat with j=1 to testMax
    repeat with i in aList
      sendsprite(i, #doit)
    end repeat
  end repeat

  put the milliseconds-t
  put gCounter
END otherTest

I set up 8 test conditions, but it's all evident from my msg window output,
so here it is:

-- Test 1 (10 sprites only, all behaviored, consecutive)

test(1,10)
-- 385
-- 100000
-- 878
-- 100000

test(496,505)
-- 384
-- 100000
-- 882
-- 100000

test(991,1000)
-- 385
-- 100000
-- 874
-- 100000

-- 10 sprites only, all behaviored, unevenly distributed
otherTest([42, 145, 255, 531, 532, 547, 592, 911, 937, 964])
-- 3345
-- 100000
-- 922
-- 100000


-- Test 2 (1000 sprites, 10 behaviored, consecutive)

test(1,10)
-- 4930
-- 100000
-- 881
-- 100000

test(496, 505)
-- 4947
-- 100000
-- 878
-- 100000

test(991,1000)
-- 4992
-- 100000
-- 872
-- 100000

-- 1000 sprites, 10 behaviored, unevenly distributed
otherTest([42, 145, 255, 531, 532, 547, 592, 911, 937, 964])
-- 4972
-- 100000
-- 921
-- 100000

My my. Warren said that sendAll is orders of magnitude faster and I agreed
with him, now I'm seeing that it's half an order of magnitude the other
friggin' way.

But wait. There's more.

I added a 2nd behavior to the sprites and ran the tests again. Here's the
new behavior and accompanying movie script:

----------------------
-- Behavior script
-- attached to every sprite that already had a behavior in the 1st series of
tests

property pIntCounter

on beginSprite me
  pIntCounter = 0
end beginSprite


on incCounter me
  pIntCounter = pIntCounter + 1
end incCounter


on queryCounter me
  put pIntCounter
end queryCounter

----------------------

-- Movie script

on newTest(sprLow, sprHigh)
  testMax = 10000

  t=the milliseconds
  repeat with j=1 to testMax
    sendAllsprites(#doit)
    sendAllSprites(#incCounter)
  end repeat

  sendAllSprites(#queryCounter)
  put the milliseconds-t

  t=the milliseconds
  repeat with j=1 to testMax
    repeat with i = sprLow to sprHigh
      sendsprite(i, #doit)
      sendSprite(i, #incCounter)
    end repeat
  end repeat

  repeat with k = sprLow to sprHigh
    sendSprite(k, #queryCounter)
  end repeat

  put the milliseconds-t
END test



on newOtherTest aList
  testMax = 10000

  t=the milliseconds
  repeat with j=1 to testMax
    sendAllsprites(#doit)
    sendAllSprites(#incCounter)
  end repeat

  sendAllSprites(#queryCounter)
  put the milliseconds-t

  t=the milliseconds
  repeat with j=1 to testMax
    repeat with i in aList
      sendsprite(i, #doit)
      sendsprite(i, #incCounter)
    end repeat
  end repeat

  repeat with k in aList
    sendSprite(i, #queryCounter)
  end repeat

  put the milliseconds-t
END otherTest

------------------

The results:
(With 10 sprites being queried and all returning identical pIntCounter
values, I've snipped out 9 redundant outputs, to save space). Also remember
that I've reversed the output, ie:
-- pIntCounter
-- time taken
-- pIntCounter
-- time taken

Here we go:

-- Test 1 (10 sprites only, all behaviored, consecutive)

newTest(1,10)
-- 10000
-- 814
-- 20000
-- 1722

newTest(496,505)
-- 10000
-- 817
-- 20000
-- 1728

newTest(991,1000)
-- 10000
-- 845
-- 20000
-- 1778

-- 10 sprites only, all behaviored, unevenly distributed
newOtherTest([42, 145, 255, 531, 532, 547, 592, 911, 937, 964])
-- 10000
-- 6772
-- 20000
-- 1802

-- Test 2 (1000 sprites, 10 behaviored, consecutive)

newTest(1,10)
-- 10000
-- 9895
-- 20000
-- 1723

newTest(496, 505)
-- 10000
-- 9940
-- 20000
-- 1719

newTest(991,1000)
-- 10000
-- 10010
-- 20000
-- 1790

-- 1000 sprites, 10 behaviored, unevenly distributed
newOtherTest([42, 145, 255, 531, 532, 547, 592, 911, 937, 964])
-- 10000
-- 10017
-- 20000
-- 1787

--------------

So, what have we?

It's clear that the deeper in the score the sprites ar e, the longer it
takes for sendAllSprites to message those sprites, suggesting that Director
is actually looking at each occupied channel iteratively -- rather
inelegant, really.

This suggests that there is in fact no container tucked away somewhere in
RAM that keeps track of which sprite owns which handler. Does anyone in the
know care to enlighten me on this?

I see that if I want to speed up the sendAllSprites search, I'll have to run
some experiments on setting up my own handlerManagerList at sprite
initialisation. But then I'd have to iterate through that list anyway, so
what's the friggin' point?

What else can we conclude?

Let's see. With lots of sprites in the score sendAll is damn slow compared
to "repeat with i = a to b", even "repeat with i in aList". Also, even if
there are few sprites in the score, if the sprites are not consective --
quite likely in many situations -- sendAll is also very slow.

Oh well. SendAllSprites is very handy, quite flexible, but can be rather
slow. Sort of handy to know, but also rather disappointing.

Pez

[To remove yourself from this list, or to change to digest mode, go to 
http://www.penworks.com/lingo-l.cgi  To post messages to the list, email 
[EMAIL PROTECTED]  (Problems, email [EMAIL PROTECTED]). Lingo-L is for 
learning and helping with programming Lingo.  Thanks!]

Reply via email to