Need help avoiding LargeInteger>>*
Daniel Vainsencher
danielv at netvision.net.il
Fri Mar 7 08:29:16 UTC 2003
Hi Chris.
It's hard to optimize code you cant see... so some general advice:
Use TimeProfileBrowser to see precisely where the time is being spent.
Use LargePositiveInteger>>digitAt:.
The bit diddling in the method you mention seems designed to delay until
the last possible moment the conversion to LI if the number is between
SmallInteger maxVal and 2^32. Since you're handling 64bit values anyway,
you no longer care about one more bit here or there ;-)
Daniel
Chris Muller <afunkyobject at yahoo.com> wrote:
>
> I have a MagmaCollection with several million entries and have a lot more I
> need to get in there using a batch program I wrote. The problem is, adding to
> a MaHashIndex is expensive, so its taking a long time to run this batch
> program.
>
> I managed to profile one of the larger commits where the program was adding
> lots of new entries to this multi-million-sized collection. The profile
> browser revealed 51.6% was spent in LargeInteger>>*.
>
> What I need is for Andreas Raab (are you the "ar" who wrote
> ByteArray>>unsignedLongAt:bigEndian:?) or anyone with as wonderful math skills
> to see if they can optimize one of my methods for maximum performance.
>
> The method I need optimized is ByteArray>>maUint:at:. It's a general method
> for reading an unsigned Integer of the specified bit-size out of a ByteArray.
> You get the method when you install Ma client server, or any Magma package.
>
> In this method, I have three guard clauses at the top to delegate to the
> existing unsignedByteAt:, unsignedShortAt: and unsignedLongAt: for reading
> numbers 32-bits or smaller. For 64-bit and larger (up to 256-bit), it falls
> through to my code.
>
> Here are the benchmarks for reading a 32-bit compared to a 64-bit number:
>
> "32-bit bench"
> |ba|
> ba _ ByteArray new: 8.
> ba maUint: 32 at: 0 put: (0 to: SmallInteger maxVal) atRandom.
> [ ba maUint: 32 at: 0 ] maBench '243124.975004999 per second.'
>
> "64-bit bench"
> |ba|
> ba _ ByteArray new: 8.
> ba maUint: 64 at: 0 put: (SmallInteger maxVal to: (2 raisedTo: 64)) atRandom.
> [ ba maUint: 64 at: 0 ] maBench '13085.18296340732 per second.'
>
> Wow, that's a tremendous difference! Unfortunately MagmaCollections, by nature
> of their design, need to read a LOT of 64-bit sized numbers.
>
> I looked at unsignedLongAt:bigEndian: and noticed the comment, "Minimize
> LargeInteger arithmetic". Good idea! Unfortunately, I just don't have the
> math training to understand how this bitShifting is being applied that I may
> copy its premise and arrive at the correct answer for 64-bit numbers.
>
> As always, I am very grateful for the generous help of those in one of the best
> OO communities around. In the meantime, I guess I'll just patiently... wait.
> :-)
>
> Thank you!
> Chris
>
> PS - I did post a new version of Magma today with Avi's bugs fixed. I haven't
> had a single bug report other than what Avi found in 1.0gamma. Maybe not many
> have tried it, although I haven't found anything else (besides this) in my use
> of it either. So it appears it may be coalescing into a true 1.0 real soon
> now! I still can't verify Linux compatibility myself. Avi, can you try it
> again for me?
>
>
>
> __________________________________________________
> Do you Yahoo!?
> Yahoo! Tax Center - forms, calculators, tips, more
> http://taxes.yahoo.com/
More information about the Squeak-dev
mailing list
|