[PATCH] a couple of collection speedups

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[PATCH] a couple of collection speedups

Paolo Bonzini-2
Here they are.

Paolo

diff --git a/ChangeLog b/ChangeLog
index 79b78ca..f29b722 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-05-22  Paolo Bonzini  <[hidden email]>
+
+ * kernel/OrderColl.st: Override #first and #last for speed.
+ * kernel/StreamOps.st: Avoid repeatedly colling #first.
+ * kernel/SeqCollect.st: Use #replaceFrom:to:with:startingAt: when doing
+ #replaceFrom:to:with: with a sequenceable collection argument.
+
 2008-05-21  Paolo Bonzini  <[hidden email]>
 
  * kernel/CCallback.st: New.
diff --git a/kernel/OrderColl.st b/kernel/OrderColl.st
index cc0ed2b..66bd8b6 100644
--- a/kernel/OrderColl.st
+++ b/kernel/OrderColl.st
@@ -56,6 +56,26 @@ on content (such as add:after:)'>
  ^self new: 16
     ]
 
+    first [
+ "Answer the first item of the receiver"
+
+ <category: 'accessing'>
+ self beConsistent.
+ ^lastIndex >= firstIndex
+    ifTrue: [self basicAt: firstIndex]
+    ifFalse: [SystemExceptions.IndexOutOfRange signalOn: self withIndex: 1]
+    ]
+
+    last [
+ "Answer the last item of the receiver"
+
+ <category: 'accessing'>
+ self beConsistent.
+ ^lastIndex >= firstIndex
+    ifTrue: [self basicAt: lastIndex]
+    ifFalse: [SystemExceptions.IndexOutOfRange signalOn: self withIndex: 0]
+    ]
+
     at: anIndex [
  "Answer the anIndex-th item of the receiver"
 
@@ -63,9 +83,9 @@ on content (such as add:after:)'>
  | index |
  self beConsistent.
  index := anIndex + firstIndex - 1.
- (index >= firstIndex and: [index <= lastIndex])
-    ifTrue: [^self basicAt: index]
-    ifFalse: [^SystemExceptions.IndexOutOfRange signalOn: self withIndex: anIndex]
+ ^(index >= firstIndex and: [index <= lastIndex])
+    ifTrue: [self basicAt: index]
+    ifFalse: [SystemExceptions.IndexOutOfRange signalOn: self withIndex: anIndex]
     ]
 
     at: anIndex put: anObject [
diff --git a/kernel/SeqCollect.st b/kernel/SeqCollect.st
index 66b1aeb..1ee37f7 100644
--- a/kernel/SeqCollect.st
+++ b/kernel/SeqCollect.st
@@ -550,6 +550,9 @@ some access and manipulation methods.'>
 
  <category: 'replacing items'>
  | i |
+        replacementCollection isSequenceable ifTrue: [
+    ^self replaceFrom: start to: stop with: replacementCollection startingAt: 1 ].
+
  i := start - 1.
  stop - i = replacementCollection size
     ifFalse: [^SystemExceptions.InvalidSize signalOn: replacementCollection size].
diff --git a/kernel/StreamOps.st b/kernel/StreamOps.st
index 0dd11e1..01744b4 100644
--- a/kernel/StreamOps.st
+++ b/kernel/StreamOps.st
@@ -77,15 +77,21 @@ Stream subclass: ConcatenatedStream [
  streams := streams copy
     ]
 
-    atEnd [
+    stream [
  <category: 'all'>
- [streams first atEnd] whileTrue:
- [streams size = 1 ifTrue: [^true].
+ | s |
+ [(s := streams first) atEnd] whileTrue:
+ [streams size = 1 ifTrue: [^nil].
  lastStart := startPos.
  startPos := startPos + curPos.
  curPos := 0.
  last := streams removeFirst].
- ^false
+ ^s
+    ]
+
+    atEnd [
+ <category: 'all'>
+ ^self stream isNil
     ]
 
     name [
@@ -96,8 +102,10 @@ Stream subclass: ConcatenatedStream [
 
     next [
  <category: 'all'>
- self atEnd ifFalse: [curPos := curPos + 1].
- ^streams first next
+ | s |
+ ^(s := self stream) isNil
+    ifTrue: [self pastEnd]
+    ifFalse: [curPos := curPos + 1.  s next]
     ]
 
     pastEnd [

_______________________________________________
help-smalltalk mailing list
[hidden email]
http://lists.gnu.org/mailman/listinfo/help-smalltalk