[squeak-dev] The Trunk: Collections-eem.746.mcz

Eliot Miranda eliot.miranda at gmail.com
Wed Apr 19 21:46:37 UTC 2017


Hi Levente,

On Tue, Apr 18, 2017 at 3:13 PM, Levente Uzonyi <leves at caesar.elte.hu>
wrote:

> On Tue, 18 Apr 2017, commits at source.squeak.org wrote:
>
> Eliot Miranda uploaded a new version of Collections to project The Trunk:
>> http://source.squeak.org/trunk/Collections-eem.746.mcz
>>
>> ==================== Summary ====================
>>
>> Name: Collections-eem.746
>> Author: eem
>> Time: 18 April 2017, 2:10:45.148995 pm
>> UUID: 8d9adaca-1401-4323-974f-1aed16ae3688
>> Ancestors: Collections-eem.745
>>
>> Nuke the pointless override of ByteSString class>>stringHash:initialHash:
>> in ByteSymbol class.  Rewrite the non-byte version to use the hashMultiply
>> primitive.
>>
>
> Do you mean that the Smalltalk code is as quick as the primitive?
>

No.  I mean that the non-primitive version for WideString should use the
hashMultiply primitive, not the decomposed non-primitive hashMultiply.


> Because without the VM changes, the primitive is 3-4 times quicker than
>
>         hash := speciesHash bitAnd: 16rFFFFFFF.
>         1 to: aString size do: [:pos |
>                 hash := hash + (aString basicAt: pos) * 1664525 bitAnd:
> 16rFFFFFFF ].
>         ^ hash
>
> So, I presume such loop will still be slower even with the primitive for
> #hashMultiply.


That's right.  But
hash := (hash + (aString basicAt: pos)) hashMultiply
is much faster than
hash := hash + (aString basicAt: pos).
"Begin hashMultiply"
low := hash bitAnd: 16383.
hash := (16r260D * low + ((16r260D * (hash bitShift: -14) + (16r0065 * low)
bitAnd: 16383) * 16384)) bitAnd: 16r0FFFFFFF.

in the latest VMs which have a machine code primitive for hashMultiply.  Im
the measurements I posted yesterday they're twice as fast.


>
>
> Levente
>
>
>
>> =============== Diff against Collections-eem.745 ===============
>>
>> Item was removed:
>> - ----- Method: ByteSymbol class>>stringHash:initialHash: (in category
>> 'primitives') -----
>> - stringHash: aString initialHash: speciesHash
>> -       ^ByteString stringHash: aString initialHash: speciesHash!
>>
>> Item was changed:
>>  ----- Method: String class>>stringHash:initialHash: (in category
>> 'primitives') -----
>>  stringHash: aString initialHash: speciesHash
>> +       "Answer the hash of a byte-indexed string, using speciesHash as
>> the initial value.
>> +        See SmallInteger>>hashMultiply."
>> +       | hash |
>> - -     | stringSize hash low |
>> -       stringSize := aString size.
>>         hash := speciesHash bitAnd: 16r0FFFFFFF.
>> +       1 to: aString size do:
>> +               [:pos |
>> +               hash := (hash + (aString basicAt: pos)) hashMultiply].
>> +       ^hash!
>> -       1 to: stringSize do: [ :pos |
>> -               hash := hash + (aString basicAt: pos).
>> -               "Begin hashMultiply"
>> -               low := hash bitAnd: 16383.
>> -               hash := (16r260D * low + ((16r260D * (hash // 16384) +
>> (16r0065 * low) bitAnd: 16383) * 16384)) bitAnd: 16r0FFFFFFF ].
>> -       ^hash.
>> - - - !
>>
>
>


-- 
_,,,^..^,,,_
best, Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20170419/e8f8460a/attachment.html>


More information about the Squeak-dev mailing list