Faster CPMutableArray removeObjectIdenticalTo:.

About 6-8X speedup by skipping all the `indexOfObjectIdenticalTo:` calls and going straight to JS `indexOf`.
This commit is contained in:
Alexander Ljungberg committed 2013-02-24 15:19:00 +00:00
1 parent c401e3b55e
commit 0268f9865c
2 files changed
+79 -1

No files matched your search

+15
View File
@@ -246,6 +246,21 @@ var concat = Array.prototype.concat,
splice.call(self, anIndex, 1);
}
- (void)removeObjectIdenticalTo:(id)anObject
{
var anIndex = indexOf.call(self, anObject);
if (anIndex !== -1)
splice.call(self, anIndex, 1);
}
- (void)removeObjectIdenticalTo:(id)anObject inRange:(CPRange)aRange
{
if (!aRange)
[self removeObjectIdenticalTo:anObject];
[super removeObjectIdenticalTo:anObject inRange:aRange];
}
- (void)addObject:(id)anObject
{
push.call(self, anObject);
+64 -1
View File
@@ -7,6 +7,14 @@ var FILE = require("file");
@global module
//+ Jonas Raoni Soares Silva
//@ http://jsfromhell.com/array/shuffle [v1.0]
function shuffle(o)
{ //v1.0
for (var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
return o;
};
var ELEMENTS = 100,
REPEATS = 10;
@@ -225,7 +233,7 @@ var ELEMENTS = 100,
indexes = [CPIndexSet indexSet];
while (c--)
array.push(""+c);
array.push("" + c);
while (location < SIZE - 10)
{
@@ -254,6 +262,50 @@ var ELEMENTS = 100,
[self fail:"_CPJavaScriptArray -objectsAtIndexes: returns an wrong value"];
}
- (void)testRemoveObjectIdenticalTo
{
REPEATS = 200;
var SIZE = 33 * 6,
allThings = [],
testSources = [];
for (var c = 0; c < SIZE; c++)
allThings.push("" + c);
var someThings = [allThings subarrayWithRange:CPMakeRange(SIZE / 3, SIZE / 3)],
removeThings = [allThings subarrayWithRange:(CPMakeRange(0, 2 * SIZE / 3))];
for (var r = 0; r < REPEATS * 2; r++)
testSources.push(shuffle(someThings));
var d = new Date(),
test1;
for (var r = 0; r < REPEATS; r++)
{
test1 = testSources.pop();
for (var i = 0, count = [removeThings count]; i < count; i++)
[test1 _previous_removeObjectIdenticalTo:removeThings[i]];
}
var dd = new Date(),
test2;
for (var r = 0; r < REPEATS; r++)
{
test2 = testSources.pop();
for (var i = 0, count = [removeThings count]; i < count; i++)
[test2 removeObjectIdenticalTo:removeThings[i]];
}
var ddd = new Date();
CPLog.warn("\n_CPJavaScriptArray -removeObjectIdenticalTo:");
CPLog.warn(" CPArray -removeObjectIdenticalTo: " + (dd - d) + "ms.");
CPLog.warn("_CPJavaScriptArray -removeObjectIdenticalTo: " + (ddd - dd) + "ms.");
if (![test1 isEqual:test2])
[self fail:"_CPJavaScriptArray -objectsAtIndexes: returns wrong value"];
}
@end
@implementation _CPJavaScriptArray (ObjectsAtIndexes)
@@ -263,6 +315,16 @@ var ELEMENTS = 100,
return [super objectsAtIndexes:indexes];
}
- (void)_previous_removeObjectIdenticalTo:(id)anObject
{
[self _previous_removeObjectIdenticalTo:anObject inRange:CPMakeRange(0, [self count])];
}
- (void)_previous_removeObjectIdenticalTo:(id)anObject inRange:(CPRange)aRange
{
[super removeObjectIdenticalTo:anObject inRange:aRange];
}
@end
@implementation CPArray (NativeSort)
@@ -326,3 +388,4 @@ var ELEMENTS = 100,
}
@end