单个对象上的 removeObject 与 removeObjectAtIndex 之间有什么性能差异?
Any performance difference between removeObject vs removeObjectAtIndex on a single object?
从 NSMutableArray
中删除单个对象时 removeObjectAtIndex
faster/more 是否比 removeObject
更有效?我假设是这样,因为搜索应该更快。
如果预计大型数组会有显着差异,我会跟踪索引。因此,问题。
removeObjectAtIndex:
会比 removeObject:
.
快很多(相对而言)
removeObjectAtIndex:
只删除一个对象和一个特定的已知索引。这是 O(1).
removeObject:
必须迭代整个数组并删除对象的每个实例。它必须对数组中的每个对象调用 isEqual:
。这需要更多的处理。这是 O(n).
综上所述,它是否真的是性能问题取决于数组的大小和数组中的对象。
除非您有理由怀疑性能问题并且使用 Instruments 查看是否真的存在问题,否则不要担心此类问题。
- (void)removeObjectAtIndex:(NSUInteger)index
为了填补空白,所有超出索引的元素都通过从其索引中减去 1 来移动。
- (void)removeObject:(ObjectType)anObject
此方法使用 indexOfObject:
定位匹配项,然后使用 removeObjectAtIndex:
删除它们。因此,匹配是根据对象对 isEqual
: 消息的响应来确定的。如果数组不包含 anObject,则该方法无效(尽管它确实会产生搜索内容的开销)。
- (NSUInteger)indexOfObject:(ObjectType)anObject
从索引 0 开始,向数组的每个元素发送一个 isEqual: 消息,直到找到匹配项或到达数组末尾。此方法将 anObject 参数传递给每个 isEqual: 消息。如果 isEqual 对象被认为是相等的:(在 NSObject 协议中声明)returns YES.
案例 1:从数组中删除最后一个对象。
- removeObjectAtIndex 将删除最后一个对象并且没有移动
require 所以它需要 O(1) 时间。
- removeObject 将调用 indexOfObject:这将花费 O(n) +
removeObjectAtIndex 将花费 O(1) ~ O(n)。
案例 2:
从数组中删除第一个对象。
- removeObjectAtIndex 将删除第一个对象并移动 n-1 个对象。
这将花费 O(n-1) ~ O(n)。
- removeObject 将调用 indexOfObject:这将花费 O(1) +
removeObjectAtIndex 将花费 O(n-1) ~ O(n)。
案例 3 从数组中删除中间对象
- removeObjectAtIndex 将删除中间对象并移动 n/2 对象。
这将花费 O(n/2).
- removeObject 将调用 indexOfObject:这将花费 O(n/2) +
removeObjectAtIndex 将花费 O(n/2) ~ O(n).
如果你有对象的索引,最好调用 removeObjectAtIndex:
从 NSMutableArray
中删除单个对象时 removeObjectAtIndex
faster/more 是否比 removeObject
更有效?我假设是这样,因为搜索应该更快。
如果预计大型数组会有显着差异,我会跟踪索引。因此,问题。
removeObjectAtIndex:
会比 removeObject:
.
removeObjectAtIndex:
只删除一个对象和一个特定的已知索引。这是 O(1).
removeObject:
必须迭代整个数组并删除对象的每个实例。它必须对数组中的每个对象调用 isEqual:
。这需要更多的处理。这是 O(n).
综上所述,它是否真的是性能问题取决于数组的大小和数组中的对象。
除非您有理由怀疑性能问题并且使用 Instruments 查看是否真的存在问题,否则不要担心此类问题。
- (void)removeObjectAtIndex:(NSUInteger)index
为了填补空白,所有超出索引的元素都通过从其索引中减去 1 来移动。
- (void)removeObject:(ObjectType)anObject
此方法使用 indexOfObject:
定位匹配项,然后使用 removeObjectAtIndex:
删除它们。因此,匹配是根据对象对 isEqual
: 消息的响应来确定的。如果数组不包含 anObject,则该方法无效(尽管它确实会产生搜索内容的开销)。
- (NSUInteger)indexOfObject:(ObjectType)anObject
从索引 0 开始,向数组的每个元素发送一个 isEqual: 消息,直到找到匹配项或到达数组末尾。此方法将 anObject 参数传递给每个 isEqual: 消息。如果 isEqual 对象被认为是相等的:(在 NSObject 协议中声明)returns YES.
案例 1:从数组中删除最后一个对象。
- removeObjectAtIndex 将删除最后一个对象并且没有移动 require 所以它需要 O(1) 时间。
- removeObject 将调用 indexOfObject:这将花费 O(n) + removeObjectAtIndex 将花费 O(1) ~ O(n)。
案例 2: 从数组中删除第一个对象。
- removeObjectAtIndex 将删除第一个对象并移动 n-1 个对象。 这将花费 O(n-1) ~ O(n)。
- removeObject 将调用 indexOfObject:这将花费 O(1) + removeObjectAtIndex 将花费 O(n-1) ~ O(n)。
案例 3 从数组中删除中间对象
- removeObjectAtIndex 将删除中间对象并移动 n/2 对象。 这将花费 O(n/2).
- removeObject 将调用 indexOfObject:这将花费 O(n/2) + removeObjectAtIndex 将花费 O(n/2) ~ O(n).
如果你有对象的索引,最好调用 removeObjectAtIndex: