我正在考虑使用 NSMutableDictionary 代替我当前的 NSMutableArray。这主要是出于 KVC/KVO 的原因。该集合将在我的绘图方法的内部循环中发生重大变化。如果我继续进行此替换,我是否会受到重大的性能影响?
干杯,道格
我正在考虑使用 NSMutableDictionary 代替我当前的 NSMutableArray。这主要是出于 KVC/KVO 的原因。该集合将在我的绘图方法的内部循环中发生重大变化。如果我继续进行此替换,我是否会受到重大的性能影响?
干杯,道格
唯一确定的方法是测量。我们没有人对 NSMutableDictionary 和 NSMutableArray 的实现如何工作有足够的了解,所以没有必要问。
当然,您可能会期待一些命中,因为字典必须执行简单数组不会执行的额外散列。这是否“重要”很难说。
再次,测量。
正如他们所说,您需要测试这些东西。但是......下面的简单测试对我了解 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"];