继续关闭这篇文章: 使用的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数组考虑...我在这一点上的选择,所以我能够改变的内部运作,以适应我想要的任何类型...
我想在下面的文章给你指出:“ 阵 ”,由ridiculous_fish ,苹果的一名工程师。 可可阵列不一定实现良好的天真数组作为你所期望的,也不是简单的字典哈希表。 他们的表现非常间接的,并且依赖于他们持有对象的数量(以及他们的价值观,等等)。 这可能不会直接影响到的答案,但它是值得考虑( NSDictionary
的表现,当然,改变你的散列函数的速度和可靠性,等等)。
此外,如果你正在寻找一个“平衡”的测试,你就必须寻找一种方式这两个类表现为彼此接近越好。 你想排除通过在字典键访问值,因为-不论如何快速查找时间是维护底层数据结构NSDictionary
-比简单地从阵列中拔出的对象,因为您要执行更多的操作做慢它。 从数组访问是O(1)
对于一个哈希表, O(1)
在最好的O(n)
在最坏的情况(这取决于实施方式,中间的某个位置)。
有几种方法来列举两个字典和数组,你上面提到。 你会想用最接近对方实施,这些要么是基于块的枚举方面的方法( enumerateObjectsUsingBlock:
对NSArray
和enumerateKeysAndObjects:
对NSDictionary
),或快速列举(使用allKeys
或allValues
为对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
是这里的赢家,特别是考虑到在你试图访问值顺序。
这是你的“平衡”的测试使用快速列举:
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
// do something with objects
}];
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
// do something with objects
}];
我试图运行一个小测试,看看性能差距是伟大的读取和NSArray的NSDictionary的 - 以及他们的可变coutnerparts之间写...
为什么? 如果它只是为了满足你的好奇心,这是一两件事。 但通常如果你需要一本字典,数组真的不会做,反之亦然。 因此,它并不重要的一个是在给定的操作速度更快 - 它不像一个是另一个很好的选择。
但是,我有找到一个“平衡”的测试困难......因为字典有2个(或3取决于你怎么看这个)通过对象循环得到(不是键)seeked价值,而阵列只一...
你让这里的一些假设,并不可能是有效的。 有可能不是很多涉及循环访问任何一种容器的元素。