的NSDictionary的NSArray的VS性能读取(performance for reads

2019-06-24 08:07发布

继续关闭这篇文章: 使用的NSMutableDictionary与NSMutableArray中带来的性能命中>

我试图运行一个小测试,看看性能差距是伟大的读取和NSArray的NSDictionary的 - 以及他们的可变coutnerparts之间写...

但是,我有找到一个“平衡”的测试困难......因为字典有2个(或3取决于你怎么看这个)通过对象循环得到(不是键)seeked价值,而阵列只一...

有什么建议?

- 如果您想了解更多的细节:我的意思是容易通过实例来讲解;

对于阵列:(在阵列的NSString * STR){做不便与琴弦}

对于词典

(for NSString *str in [dictionary allValues]) { string }

要么

(for NSString *str in [dictionary allKeys]) { [dictionary valueForKey:key] }

要么

(for NSString *str in [dictionary allKeys]) { string }

甚至

NSArray *valuesOrKeys = [dictionary allKeys/allValues];

(for NSString *str in valuesOrKeys) {string }

什么是“公平”测试的字典呢?

- 编辑(评论)

正如大家指出(并问我为什么会想要那个),当使用字典,这是因为它符合模型比数组更好...

以及对我的要求的原因是,一个应用程序,我要建不但慢,而且,所以我想弄清楚,如果使用不同的数据类型会改变任何的是,和我使用基本的C数组考虑...我在这一点上的选择,所以我能够改变的内部运作,以适应我想要的任何类型...

Answer 1:

我想在下面的文章给你指出:“ 阵 ”,由ridiculous_fish ,苹果的一名工程师。 可可阵列不一定实现良好的天真数组作为你所期望的,也不是简单的字典哈希表。 他们的表现非常间接的,并且依赖于他们持有对象的数量(以及他们的价值观,等等)。 这可能不会直接影响到的答案,但它是值得考虑( NSDictionary的表现,当然,改变你的散列函数的速度和可靠性,等等)。

此外,如果你正在寻找一个“平衡”的测试,你就必须寻找一种方式这两个类表现为彼此接近越好。 你想排除通过在字典键访问值,因为-不论如何快速查找时间是维护底层数据结构NSDictionary -比简单地从阵列中拔出的对象,因为您要执行更多的操作做慢它。 从数组访问是O(1)对于一个哈希表, O(1)在最好的O(n)在最坏的情况(这取决于实施方式,中间的某个位置)。

有几种方法来列举两个字典和数组,你上面提到。 你会想用最接近对方实施,这些要么是基于块的枚举方面的方法( enumerateObjectsUsingBlock:NSArrayenumerateKeysAndObjects:NSDictionary ),或快速列举(使用allKeysallValues为对NSDictionary )。 由于这些算法的性能主要是经验性的,我进行了多次试验需要注意的访问时间(每个有10000个NSNumber对象):

NSArray, Block Enumeration:
1. 10.5s
2.  9.1s
3. 10.0s
4.  9.8s
5.  9.9s
   -----
    9.9s Avg

NSArray, Fast Enumeration:
1.  9.7s
2.  9.5s
3.  9.3s
4.  9.1s
5. 10.5s
   -----
    9.6s Avg

NSDictionary, Block Enumeration
1. 10.5s
2. 10.6s
3.  9.9s
4. 11.1s
5. 11.0s
   -----
   10.6s Avg

NSDictionary, allKeys -> Fast Enumeration
1. 10.0s
2. 11.2s
3. 10.2s
4. 10.8s
5. 10.8s
   -----
   10.6s Avg

NSDictionary, allValues -> Fast Enumeration
1. 10.7s
2. 10.3s
3. 10.5s
4. 10.5s
5.  9.7s
   -----
   10.3s Avg

正如可以从该人为试验的结果看到的, NSDictionary比清楚地慢NSArray (使用块枚举左右慢7%,并用快速枚举慢7-10%)。 然而,这种比较是毫无意义,看到用最快的枚举NSDictionary只是转予它变成一个数组反正。

因此,最大的问题是,为什么您会考虑使用一本字典? 数组和哈希表是不完全互换; 什么样的模式,你必须允许简易替换的NSArray使用NSDictionary ? 无论通过人为的例子给出证明性能时代的好处之一这样或那样的,你应该始终贯彻在某种程度上是有道理的模型-您可以稍后优化性能,如果你要。 我不知道你将如何使用这些数据结构可以互换,但无论如何, NSArray是这里的赢家,特别是考虑到在你试图访问值顺序。



Answer 2:

这是你的“平衡”的测试使用快速列举:

[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    // do something with objects    
}];
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
    // do something with objects    
}];


Answer 3:

我试图运行一个小测试,看看性能差距是伟大的读取和NSArray的NSDictionary的 - 以及他们的可变coutnerparts之间写...

为什么? 如果它只是为了满足你的好奇心,这是一两件事。 但通常如果你需要一本字典,数组真的不会做,反之亦然。 因此,它并不重要的一个是在给定的操作速度更快 - 它不像一个是另一个很好的选择。

但是,我有找到一个“平衡”的测试困难......因为字典有2个(或3取决于你怎么看这个)通过对象循环得到(不是键)seeked价值,而阵列只一...

你让这里的一些假设,并不可能是有效的。 有可能不是很多涉及循环访问任何一种容器的元素。



文章来源: performance for reads of nsdictionary vs nsarray