[squeak-dev] The Trunk: Nebraska-ul.32.mcz

commits at source.squeak.org commits at source.squeak.org
Mon Feb 28 06:42:31 UTC 2011


Levente Uzonyi uploaded a new version of Nebraska to project The Trunk:
http://source.squeak.org/trunk/Nebraska-ul.32.mcz

==================== Summary ====================

Name: Nebraska-ul.32
Author: ul
Time: 28 February 2011, 7:42:18.721 am
UUID: ee0e143b-7c07-0c49-9505-edac998570ca
Ancestors: Nebraska-nice.31

Moved String's #getInteger32: and #putInteger32:at: to this package. The methods only make sense for ByteStrings.
Both methods are rewritten to
- avoid creation of LargeIntegers
- use fast integer and string manipulation methods
- use the stack optimally if possible
The new methods are 2-15x faster than the previous implementations. Combining this with the speedup of Cog, the use of IntegerPokerPlugin is probably unnecessary (it's not present in current VMs).

=============== Diff against Nebraska-nice.31 ===============

Item was added:
+ ----- Method: ByteString>>getInteger32: (in category '*Nebraska') -----
+ getInteger32: location
+ 	"Read a SmallInteger stored in the receiver using big-endian one's complement representation. Avoid creation of LargeIntegers."
+ 
+ 	| firstByte |
+ 	(firstByte := self byteAt: location) < 64 ifTrue: [ 
+ 		^(((((
+ 			firstByte bitShift: 8) bitOr:
+ 			(self byteAt: location + 1)) bitShift: 8) bitOr: 
+ 			(self byteAt: location + 2)) bitShift: 8) bitOr: 
+ 			(self byteAt: location + 3) ].
+ 	^(64 - firstByte bitShift: 24) - (((((
+ 		(self byteAt: location + 1)) bitShift: 8) bitOr: 
+ 		(self byteAt: location + 2)) bitShift: 8) bitOr: 
+ 		(self byteAt: location + 3))
+ !

Item was added:
+ ----- Method: ByteString>>putInteger32:at: (in category '*Nebraska') -----
+ putInteger32: anInteger at: location
+ 	"Store a SmallInteger in the receiver using big-endian one's complement representation. Avoid creation of LargeIntegers."
+ 	
+ 	| integer firstByte |
+ 	(integer := anInteger) >= 0 
+ 		ifTrue: [ firstByte := (anInteger bitShift: -24) bitAnd: 255 ]
+ 		ifFalse: [
+ 			integer := 0 - integer.
+ 			firstByte := (integer bitShift: -24) + 64 bitAnd: 255 ].
+ 	self 
+ 		byteAt: location put: firstByte;
+ 		byteAt: location + 1 put: ((integer bitShift: -16) bitAnd: 255);
+ 		byteAt: location + 2 put: ((integer bitShift: -8) bitAnd: 255);
+ 		byteAt: location + 3 put: (integer bitAnd: 255)
+ !




More information about the Squeak-dev mailing list