我在考虑使用NSMutableDictionary来替换当前的NSMutableArray。主要是为了KVC/KVO的原因。这个集合将在我的绘图方法的内部循环中经历大量变化。如果我进行这个替换,我可以期望遭受显著的性能损失吗?
谢谢, 道格
我在考虑使用NSMutableDictionary来替换当前的NSMutableArray。主要是为了KVC/KVO的原因。这个集合将在我的绘图方法的内部循环中经历大量变化。如果我进行这个替换,我可以期望遭受显著的性能损失吗?
谢谢, 道格
正如他们所说,你需要测试这些东西。但是......以下简单的测试对我来说很有启示性,让我了解了NSMutableDictionary和NSMutableArray集合类在小型高分配率示例情况下速度上的相对差异。
运行以下程序,时间为:(开启垃圾回收)(在最近的四核机器上)
NSMutableDictionary 4.624478秒 NSMutableArray 1.806365秒
int main (int argc, const char * argv[])
{
NSLog(@"Hello, World!");
LNCStopwatch* stopwatch = [[LNCStopwatch alloc] init];
[stopwatch start];
for (int i = 1; i< 1000000; i++)
{
NSMutableDictionary* dict = [[NSMutableDictionary alloc]init];
[dict setObject:@"a" forKey:@"a"];
[dict setObject:@"b" forKey:@"b"];
[dict setObject:@"c" forKey:@"c"];
[dict setObject:@"d" forKey:@"d"];
[dict setObject:@"e" forKey:@"e"];
[dict setObject:@"y" forKey:@"a"];
[dict setObject:@"x" forKey:@"d"];
}
[stopwatch stopAndLogTimeAndReset];
[stopwatch start];
for (int i = 1; i< 1000000; i++)
{
NSMutableArray* arr = [[NSMutableArray alloc]init];
[arr addObject:@"a"];
[arr addObject:@"b"];
[arr addObject:@"c"];
[arr addObject:@"d"];
[arr addObject:@"e"];
[arr replaceObjectAtIndex:[arr indexOfObject:@"a"] withObject:@"y"];
[arr replaceObjectAtIndex:[arr indexOfObject:@"d"] withObject:@"x"];
}
[stopwatch stopAndLogTimeAndReset];
return 0;
}
我认为绝对时间并不是很重要,对于这些小型类而言相对时间更为重要。当然,对于大型类而言,集合类的性质将会占主导地位,例如 NSMutableDictionary 应该是 O(1) 来查找元素等等...
当你说“主要是为了KVC/KVO的原因”,你能详细解释一下吗?
如果在大量变异下看到由于过度的KVO触发而导致性能问题,请考虑在完成后自己触发KVO通知:
[self willChangeValueForKey: @"myArray"];
// loop and mutate
[self didChangeValueForKey: @"myArray"];