4

我正在考虑使用 NSMutableDictionary 代替我当前的 NSMutableArray。这主要是出于 KVC/KVO 的原因。该集合将在我的绘图方法的内部循环中发生重大变化。如果我继续进行此替换,我是否会受到重大的性能影响?

干杯,道格

4

3 回答 3

6

唯一确定的方法是测量。我们没有人对 NSMutableDictionary 和 NSMutableArray 的实现如何工作有足够的了解,所以没有必要问。

当然,您可能会期待一些命中,因为字典必须执行简单数组不会执行的额外散列。这是否“重要”很难说。

再次,测量

于 2009-07-08T14:16:30.690 回答
4

正如他们所说,您需要测试这些东西。但是......下面的简单测试对我了解 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) 找到一个元素等...)

于 2010-07-06T18:06:55.400 回答
0

当您说“主要出于 KVC/KVO 原因”时,您能详细说明一下吗?

如果您看到由于在重度突变下过度 KVO 触发而导致的性能问题,请考虑在完成后自己触发 KVO 通知:

[self willChangeValueForKey: @"myArray"];

// loop and mutate

[self didChangeValueForKey: @"myArray"];
于 2009-07-08T15:16:18.207 回答