[squeak-dev] FloatConstants?
Eliot Miranda
eliot.miranda at gmail.com
Sun Dec 21 21:11:35 UTC 2014
Hi Levente,
please rewrite using a temp to hold the raw bits, a class var to hold the float array and hexadecimal. Then one can understand much easier. Also is inlining isFinite that important for performance?
rawBits := FloatArrayBuffer at: 1 put: self; basicAt: 1
etc...
Eliot (phone hence not writing the full method)
On Dec 20, 2014, at 7:27 PM, Levente Uzonyi <leves at elte.hu> wrote:
> On Sat, 20 Dec 2014, Chris Muller wrote:
>
>> On Fri, Dec 19, 2014 at 4:01 PM, Louis LaBrunda
>> <Lou at keystone-software.com> wrote:
>>> Hi Chris,
>>>
>>> Is this any faster?
>>>
>>> Float>>#hashKey32
>>>
>>> ^self isFinite ifTrue: [
>>> self negative ifTrue: [4286578688 - self asIEEE32BitWord] ifFalse: [self
>>> asIEEE32BitWord + 2147483651]
>>> ] ifFalse: [self negative ifTrue: [0] ifFalse: [4294967294]].
>>
>> About the same, but I think I like your code better. Thanks.
>
> Dave has already suggested to use a FloatArray for conversion instead of #asIEEE32BitWord. We use this technique in various network protocol implementations, and it works great.
>
> Here's a significantly faster, optimized version:
>
> hashKey32: aFloatArray
>
> self - self = 0.0 ifTrue: [
> self < 0.0 ifTrue: [ ^4286578688 - (aFloatArray at: 1 put: self; basicAt: 1) ].
> ^2147483651 + (aFloatArray at: 1 put: self; basicAt: 1) ].
> self < 0.0 ifTrue: [ ^0 ].
> ^4294967294
>
> The argument is any FloatArray instance with at least one slot.
>
>
> Levente
>
>
More information about the Squeak-dev
mailing list
|