[squeak-dev] The Inbox: Kernel-dtl.1015.mcz
David T. Lewis
lewis at mail.msen.com
Thu Apr 14 00:25:33 UTC 2016
Hi Levente,
I think you may be right. I repeated my test with an interpreter VM on a
32-bit image (with loop count smaller because the interpreter VM is slower
than Spur). The change that I put in the inbox does not have any benefit
for the interpreter VM:
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 level V3 image with interpreter VM"
Time millisecondsToRun: [5000000 timesRepeat: [ a = b ]]. "==> 3844"
Time millisecondsToRun: [5000000 timesRepeat: [ a = c ]]. "==> 3786"
Time millisecondsToRun: [5000000 timesRepeat: [ a = d ]].. "==> 3800"
"Performance after adding LargePositiveInteger>>="
Time millisecondsToRun: [5000000 timesRepeat: [ a = b ]]. "==> 3868"
Time millisecondsToRun: [5000000 timesRepeat: [ a = c ]]. "==> 3775"
Time millisecondsToRun: [5000000 timesRepeat: [ a = d ]]. "==> 3770"
So yes it is something related to the VM. But I do not understand
how #primDigitCompare could be so slow? As you say, maybe something
is wrong with it.
Thank you, I am glad that I asked for a review :-)
Dave
On Thu, Apr 14, 2016 at 01:45:42AM +0200, Levente Uzonyi wrote:
> 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
|