On Fri, May 14, 2010 at 10:28 AM, Levente Uzonyi leves@elte.hu wrote:
On Fri, 14 May 2010, christophe.jalady@free.fr wrote:
Just print this two scripts:
|s| s := WideString with: (Character value: 16r55E4). [100000 timesRepeat: [s hash]] timeToRun.
|s| s := ByteString with: (Character value: 16rE4) with: (Character value: 16rE4) with: (Character value: 16rE4) with: (Character value: 16rE4). [100000 timesRepeat: [s hash]] timeToRun.
I've seen that "ByteString>>stringHash:initialHash" use a primitive. Could we have such optimisation for WideString ?
Sure. There are (at least) four ways to do it:
- Update the implementation of the primitive to support wordarrays. Then
build a vm with it and finally change the image side code. This would be the best IMHO. Is there a reason why the primitive is not implemented this way? 2) Use NativeBoost to write a primitive for this method. This is much easier than building a vm/plugin, though you have to write the code in X86 assembly. This would be a cool demo for NativeBoost's primitive writing capabilities. (Much better than the Fibonacci-number calculator. :)) 3) Use Exupery, I think it can optimize methods like this. 4) Use the Cog VM. ;) (I wonder how fast this method is with Cog.)
2.66GHz Intel Core i7 MacBook Pro (my new tool!!!!). Current Cog, my 3.8 derived work image:
|s| s := WideString with: (Character value: 16r55E4). [100000 timesRepeat: [s hash]] timeToRun. 16
|s| s := ByteString with: (Character value: 16rE4) with: (Character value: 16rE4) with: (Character value: 16rE4) with: (Character value: 16rE4). [100000 timesRepeat: [s hash]] timeToRun. 10
|s| s := WideString with: (Character value: 16r55E4). [100000000 timesRepeat: [s hash]] timeToRun. 15725
|s| s := ByteString with: (Character value: 16rE4) with: (Character value: 16rE4) with: (Character value: 16rE4) with: (Character value: 16rE4). [100000000 timesRepeat: [s hash]] timeToRun. 11078
Current 4.1/Squeak 4.1.1beta2U.app: |s| s := WideString with: (Character value: 16r55E4). [100000 timesRepeat: [s hash]] timeToRun. 98
|s| s := ByteString with: (Character value: 16rE4) with: (Character value: 16rE4) with: (Character value: 16rE4) with: (Character value: 16rE4). [100000 timesRepeat: [s hash]] timeToRun. 31
|s| s := WideString with: (Character value: 16r55E4). [100000000 timesRepeat: [s hash]] timeToRun. 100660
|s| s := ByteString with: (Character value: 16rE4) with: (Character value: 16rE4) with: (Character value: 16rE4) with: (Character value: 16rE4). [100000000 timesRepeat: [s hash]] timeToRun. 29476
Current 4.1/current Cog |s| s := WideString with: (Character value: 16r55E4). [100000 timesRepeat: [s hash]] timeToRun. 14
|s| s := ByteString with: (Character value: 16rE4) with: (Character value: 16rE4) with: (Character value: 16rE4) with: (Character value: 16rE4). [100000 timesRepeat: [s hash]] timeToRun. 10
|s| s := WideString with: (Character value: 16r55E4). [100000000 timesRepeat: [s hash]] timeToRun. 14946
|s| s := ByteString with: (Character value: 16rE4) with: (Character value: 16rE4) with: (Character value: 16rE4) with: (Character value: 16rE4). [100000000 timesRepeat: [s hash]] timeToRun. 10171
So quite a bit faster :)
best Eliot
Levente
Christophe.