[Cuis-dev] usefulness of a faster #timesRepeat?

Juan Vuletich juan at jvuletich.org
Fri Nov 8 08:40:14 PST 2019


Hi,

(inline)

On 11/7/2019 7:54 PM, Andres Valloud via Cuis-dev wrote:
> No, I had not looked at #bench.  I did some experiments here, and it 
> looks like it could be improved too, for really fast blocks like [2+3] 
> the measured speed difference is on the order of 30%.
>
> Moreover, I think it would be nicer if bench did a GC before starting 
> the measurement.  In some other worlds, I also saw that such 
> measurement methods would go to the trouble of ensuring as far as 
> possible that the code under consideration was already jitted before 
> the measurement begins.  I suppose that helps in very large blocks of 
> code or that perhaps do not run many iteration.  See attached and let 
> me know what you think.

Agreed on all three points. Your version is a nice improvement.

> The benchmarks I was running were trying to evaluate variations on 
> code that uses smallintegers a lot.  So either I would have to 
> increase the repetitions of the code under consideration inside the 
> timesRepeat: to minimize the overhead (that makes workspaces rather 
> verbose and repetitive), or I would have to consider the overhead 
> explicitly and start the subtraction game.  Part of what motivated the 
> improvement in timesRepeat: was to lower the relative overhead so 
> repeating code in workspaces or manually accounting for the 
> timesRepeat: overhead would become less necessary for the sake of 
> measurement precision.
>
> I was a bit surprised I could get it to run 50% faster, I wasn't 
> expecting that.  For contrast, in other worlds, timesRepeat: is also 
> optimized by the Smalltalk compiler.  This introduces some kinks.
>
> First, especially in 32 bit systems, it's very important never to send 
> timesRepeat: to a large integer --- this is why the large integer 
> method splits the process in rounds of timesRepeat: sent to small 
> integers. 

I guess you mean 'never run the iteration on LargeInteger arithmetic', 
so with the splitting in LargePositiveInteger, sending timesRepeat: to a 
large integer is ok...

> Second, timesRepeat: is only optimized when it's followed by an 
> explicit, literal block, e.g.:
>
>     10 timesRepeat: [self blah]
>
> rather than
>
>     10 timesRepeat: aBlock
>
> So, in those contexts, sometimes it's necessary to write code like 
> this instead to enable the compiler optimization:
>
>     10 timesRepeat: [aBlock value]
>
> If the overhead of timesRepeat: is minimized, perhaps the Smalltalk 
> compiler optimization is unnecessary.
>
> Andres.

Interesting. Not the case in Cuis, where there is no Compiler 
optimization of #timesRepeat:

Still, I wasn't explicit on what I really wanted to ask... My question 
is: Is #bench (or bench: seconds) a good replacement for #timesRepeat:? 
If so, does still make sense to have an optimized version of #timesRepeat:?

>
> On 11/7/19 14:08, Juan Vuletich via Cuis-dev wrote:
>> Hi, Andrés, Folks,
>>
>> I was thinking about the need you see for a faster implementation of 
>> #timesRepeat:. I guess you are using it for benchmarking, right? I 
>> also guess you are benchmarking some code that takes very little time 
>> to run, to make the overhead of #timesRepeat: noticeable.
>>
>> If that is the case, have you looked at #bench? It was brought from 
>> Squeak, and it is the 'standard' way of benchmarking small pieces of 
>> code.
>>
>> Cheers,
>>

Thanks,

-- 
Juan Vuletich
www.cuis-smalltalk.org
https://github.com/Cuis-Smalltalk/Cuis-Smalltalk-Dev
https://github.com/jvuletich
https://www.linkedin.com/in/juan-vuletich-75611b3
@JuanVuletich



More information about the Cuis-dev mailing list