使用NSMutableDictionary相比NSMutableArray会带来性能损失吗?

4

我在考虑使用NSMutableDictionary来替换当前的NSMutableArray。主要是为了KVC/KVO的原因。这个集合将在我的绘图方法的内部循环中经历大量变化。如果我进行这个替换,我可以期望遭受显著的性能损失吗?

谢谢, 道格

3个回答

6
唯一确定的方法就是测量。我们都不太了解NSMutableDictionary和NSMutableArray的实现方式,所以询问也没有多大意义。
可以预计字典会遇到额外的哈希操作,而简单数组则不需要。但这是否“显著”很难说。
再次强调,测量

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) 来查找元素等等...


0

当你说“主要是为了KVC/KVO的原因”,你能详细解释一下吗?

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

[self willChangeValueForKey: @"myArray"];

// loop and mutate

[self didChangeValueForKey: @"myArray"];

1
嗨,弗雷泽, 我正在开发一个粒子系统的iPhone应用程序,可能会有数百个精灵在屏幕上飞来飞去。渲染是使用OpenGL完成的。为了好玩,我使用了KVO来观察每个粒子的出生/死亡情况,但当我将其安装到设备上时,应用程序就会停止运行。由于KVO的开销对于这种情况来说过高,所以字典/数组问题已经不再相关了。 - dugla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接