I spent my day testing and comparing execution speed between classes and
anonymous subclasses when i tried to compare two sets of values between
pharo classes: they also differ. 

In fact it seems that every instruction has a different execution speed
if we run it enough times. So it seems impossible to precisely compare
execution time between anon classes and pharo classes, at least i don't
know how to do it. I computed confidence intervals of various measures,
the differences in execution time that exist between classes and
anonymous classes can be between -2% to + 9%. But comparing sets of
speed between pharo classes, i also have similar intervals (but smaller,
from -2% speed to +5% speed). 

So maybe they have similar performances, at least sometimes they do and
sometimes one is slightly faster than the other, but in the end it is
not possible to tell. But maybe i'm looking for something which does not
even exist, maybe anonymous classes are designed to be as fast as
regular classes ? Or maybe it is common to have such variability when
benchmarking code ? 

Does it exist any instruction in pharo with a constant execution time ?
(or it could be possible with one million years to compute enough speed
tests and do an accurate mean...) 

Steven. 

Le 2017-06-16 18:14, Steven Costiou a écrit :

> You can find the code below. I just change the call to m by m1 to test the 
> two methods. 
> 
> I started again in a fresh pharo 6 image and now the results seem all similar 
> for the following code. I will do all my tests again to see if it was my 
> fault but it takes a lot of time (2 hours for each full test). 
> 
> What sould be the expected results ? Should an instance of an anonymous class 
> be as fast as a regular instance when calling the same code, being defined in 
> the anon class or its super class ? 
> 
> A implements m ^100 printString and B subclass of A implements m1 ^100 
> printString 
> 
> a := B new. 
> 
> class := A newAnonymousSubclass 
> addSlot: (InstanceVariableSlot named: #y); compile: 'm1
> ^100 printString'; yourself.
> c := A new becomeForward: class new.
> 
> res := Dictionary new.
> col1 := OrderedCollection new.
> col2 := OrderedCollection new. 
> 
> 10000 timesRepeat: [
> Smalltalk garbageCollect .
> col1 add: [1000000 timesRepeat: [ a m ]] timeToRun]. 
> 
> 10000 timesRepeat: [
> Smalltalk garbageCollect .
> col2 add: [1000000 timesRepeat: [ c m ]] timeToRun]. 
> 
> res at: 'a' put: col1.
> res at: 'c' put: col2.
> res inspect
 

Reply via email to