[squeak-dev] The Inbox: Collections-cmm.873.mcz
commits at source.squeak.org
commits at source.squeak.org
Wed Jan 22 05:54:30 UTC 2020
Chris Muller uploaded a new version of Collections to project The Inbox:
http://source.squeak.org/inbox/Collections-cmm.873.mcz
==================== Summary ====================
Name: Collections-cmm.873
Author: cmm
Time: 21 January 2020, 11:54:25.478956 pm
UUID: 3ec60cd4-3b16-4cf7-98bf-bc85acaa4192
Ancestors: Collections-ul.871
Let #new: *always* be a performance-improving choice over #new, when the correct size is known.
=============== Diff against Collections-ul.871 ===============
Item was changed:
----- Method: HashedCollection class>>goodPrimeAtLeast: (in category 'sizing') -----
goodPrimeAtLeast: lowerLimit
"Answer the smallest good prime >= lowerlimit.
If lowerLimit is larger than the largest known good prime, just make it odd.
Use linear search, and exponential search to speed up cases when lowerLimit is small (<2500 and <100000, respectively).
Assume that there are goodPrimes greater than 100000."
| highIndex midIndex lowIndex prime |
- lowerLimit <= 7 ifTrue: [
- lowerLimit <= 3 ifTrue: [ ^3 ].
- lowerLimit <= 5 ifTrue: [ ^5 ].
- ^7 ].
GoodPrimes ifNil: [ "migration only"
self initializeGoodPrimes ].
lowerLimit < 2500 ifTrue: [
"Use linear search when the limit is small. The boundary is based on measurements."
highIndex := 4. "skip 3 5 and 7"
[ (GoodPrimes at: highIndex) < lowerLimit ] whileTrue: [
highIndex := highIndex + 1 ].
^GoodPrimes at: highIndex ].
lowerLimit < 100000
ifTrue: [
"Use exponential search when the limit is not too large. The boundary is based on measurements."
highIndex := 1.
[ (GoodPrimes at: highIndex) < lowerLimit ] whileTrue: [
highIndex := highIndex * 2 ].
lowIndex := highIndex // 2 + 1. "highIndex // 2 was smaller than lowerLimit" ]
ifFalse: [
"Regular binary search."
lowIndex := 1.
highIndex := GoodPrimes size.
"Check whether the largest prime would fit"
(GoodPrimes at: highIndex) < lowerLimit ifTrue: [
^lowerLimit bitOr: 1 ]. ].
[ highIndex - lowIndex <= 1 ] whileFalse: [
midIndex := highIndex + lowIndex // 2.
prime := GoodPrimes at: midIndex.
lowerLimit < prime
ifTrue: [ highIndex := midIndex ]
ifFalse: [
lowerLimit > prime
ifTrue: [ lowIndex := midIndex ]
ifFalse: [ ^prime ] ] ].
(GoodPrimes at: lowIndex) >= lowerLimit ifTrue: [ ^GoodPrimes at: lowIndex ].
^GoodPrimes at: highIndex!
Item was changed:
----- Method: HashedCollection class>>new: (in category 'instance creation') -----
+ new: numberOfElements
+ "Create a Set large enough to hold numberOfElements without growing"
+ ^ self basicNew initialize:
+ (numberOfElements < 3
+ ifTrue: [ 3 ]
+ ifFalse:
+ [ numberOfElements < 4
+ ifTrue: [ 5 ]
+ ifFalse: [ self sizeFor: numberOfElements ] ])!
- new: nElements
- "Create a Set large enough to hold nElements without growing"
- ^ self basicNew initialize: (self sizeFor: nElements)!
More information about the Squeak-dev
mailing list
|