[squeak-dev] The Inbox: Kernel-dtl.1015.mcz

Levente Uzonyi leves at caesar.elte.hu
Wed Apr 13 23:45:42 UTC 2016


Hi Dave,

I guess this is a VM related issue. On 64-bit Spur
[ 7432154326465436 digitCompare: 8432154326465436 ] bench.
returns '5,420,000 per second. 184 nanoseconds per run.'.

Removing the primitive call from #digitCompare: the number goes up:
'20,200,000 per second. 49.4 nanoseconds per run.'.

You might think that it's okay because the JIT is so good. But we have 
another primitive to compare two bytes-objects. One which ought be 
slower than #primDigitCompare:, because it maps the bytes before doing the 
comparison. I even subtracted two from its result to match the result of 
#digitCompare:

| order |
order := (0 to: 255) as: ByteArray.
[ (ByteString compare: 7432154326465436 with: 8432154326465436 collated: order) - 2 ] bench.

But it's still about twice as quick as #primDigitCompare:.
'9,590,000 per second. 104 nanoseconds per run.'.
So, something must be wrong with #primDigitCompare:.

Levente

On Wed, 13 Apr 2016, David T. Lewis wrote:

> I would appreciate a review before moving this to trunk.
>
> Background:
>
> In UTCDateAndTime, most things are much faster than the trunk version.
> However, DataAndTime equality check did not improve for 32-bit images,
> so I ran it under AndreasSystemProfiler. Profiling showed that large
> integer equality checks spends time mostly in primDigitCompare, which
> is inefficient when only a simple byte comparison is needed.
>
> Here is the performance difference that I see on my system, 32-bit trunk
> Spur on Linux:
>
>  | a b c d |
>  a := 7432154326465436. "a big number"
>  b := a + 1. "low order digit changed"
>  c := 8432154326465436. "high order digit changed"
>  d := 7432154026465436. "a digit in the middle changed"
>
>  "Base performance in the trunk image"
>  Time millisecondsToRun: [500000000 timesRepeat: [ a = b ]]. "==> 63733"
>  Time millisecondsToRun: [500000000 timesRepeat: [ a = c ]]. "==> 63152"
>  Time millisecondsToRun: [500000000 timesRepeat: [ a = d ]]. "==> 63581"
>
>  "Performance after adding LargePositiveInteger>>="
>  Time millisecondsToRun: [500000000 timesRepeat: [ a = b ]]. "==> 4676"
>  Time millisecondsToRun: [500000000 timesRepeat: [ a = c ]]. "==> 4883"
>  Time millisecondsToRun: [500000000 timesRepeat: [ a = d ]]. "==> 4512"
>
> Dave
>
>
>
> On Wed, Apr 13, 2016 at 10:57:28PM +0000, commits at source.squeak.org wrote:
>> David T. Lewis uploaded a new version of Kernel to project The Inbox:
>> http://source.squeak.org/inbox/Kernel-dtl.1015.mcz
>>
>> ==================== Summary ====================
>>
>> Name: Kernel-dtl.1015
>> Author: dtl
>> Time: 13 April 2016, 6:57:22.56608 pm
>> UUID: bd849f91-9b00-45c5-b2ab-891b420bde5e
>> Ancestors: Kernel-mt.1014
>>
>> Make large integer equality test be about 13 times faster. Implement #= in LargePositiveInteger, and use digitAt: (primitive 60) for the comparison.
>>
>> =============== Diff against Kernel-mt.1014 ===============
>>
>> Item was added:
>> + ----- Method: LargePositiveInteger>>= (in category 'comparing') -----
>> + = aNumber
>> +
>> + 	aNumber class == self class ifTrue: [
>> + 		aNumber size = self size ifFalse: [ ^false ].
>> + 		self size to: 1 by: -1 do: [ :i | (aNumber digitAt: i) = (self digitAt: i) ifFalse: [ ^ false ] ].
>> + 		^ true ].
>> + 	aNumber isInteger ifTrue: [ ^false ].
>> + 	aNumber isNumber ifFalse: [ ^false ].
>> + 	^aNumber adaptToInteger: self andCompare: #=!
>>
>
>


More information about the Squeak-dev mailing list