objective-c – 读取nsdictionary与nsarray的性能
继续这篇文章:
Performance hit incurred using NSMutableDictionary vs. NSMutableArray>
我正在尝试进行一些测试,以确定性能差距是否对NSArray和& ;;之间的读写非常有用. NSDictionary以及他们可变的coutnerparts …… 但是,我很难找到“平衡”测试…因为字典有2个(或3个,具体取决于你如何看待这个)对象循环以获取所寻找的值(而不是键),而数组只有一… 有什么建议? – 如果您想了解更多细节: 对于数组: 对于字典 (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 } 对字典做什么是“最公平”的测试? –EDIT(评论) 正如你们所指出的那样(并问我为什么会这么想),当使用字典时,这是因为它比数组更适合模型…… 我问的原因是我正在构建的应用程序是非常缓慢的,所以我试图弄清楚是否使用不同的数据类型会改变其中任何一个,我正在考虑使用基本的c数组……我现在有了选择,所以我能够改变内部工作方式以适应我想要的任何类型…… 解决方法
我想在下面的文章中指出:“
Array”,ridiculous_fish,Apple工程师. Cocoa数组不一定是你想象中的天真数组,也不是字典简单的哈希表.它们的表现非常具有间接性,取决于它们所拥有的物体数量(以及它们的价值等).这可能不会直接影响答案,但需要考虑的是(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的最快枚举只是简单地将它转换为数组. 所以最大的问题是,你为什么要考虑使用字典?数组和哈希表不完全可以互换;你有什么样的模型允许用NSDictionary直接替换NSArray?无论人工举例说明如何以某种方式证明性能优势,您都应该以一种有意义的方式实现模型 – 如果必须,您可以稍后优化性能.我不知道你将如何交替使用这些数据结构,但无论如何,NSArray在这里是赢家,特别是考虑到你试图访问值的顺序. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |