cyclic looping with [0 == object] whileFalse: [object := object nextObject].

Paolo Bonzini bonzini at gnu.org
Tue Nov 6 15:37:24 UTC 2007


> However given you are doing message sends, block evaluations etc in 
> allInstancesDo:. Then *MILLIONS* of bytecodes  and 100 of thousands of 
> method invocations run
> to do the same task.  Thus in a simple loop iterating over an object and 
> doing a message send to ask them if they are a Morph is *way faster*

Unfortunately, something like this would also be slower than #nextObject:

     Morph withAllSubclassesDo: [ :each |
         inst _ each someInstance.
         [inst == nil] whileFalse:
             [next _ inst nextInstance.
             inst removeProperty: #undoGrabCommand.
             inst _ next]

because of the *huge* amount of Morph subclasses in the image.    You 
are walking the object memory hundreds of times rather than one, and I 
found out a few years ago (on a different computer) that using a Set (!) 
and #nextObject is faster than using #nextInstance if you have about 20 
subclasses (or more).

This would work for Rob however.

Paolo



More information about the Squeak-dev mailing list