objective-c – 读取nsdictionary与nsarray的性能

objective-c – 读取nsdictionary与nsarray的性能,第1张

概述继续这篇文章: Performance hit incurred using NSMutableDictionary vs. NSMutableArray> 我正在尝试进行一些测试,以确定性能差距是否对NSArray和&amp ;;之间的读写非常有用. NSDictionary以及他们可变的coutnerparts …… 但是,我很难找到“平衡”测试…因为字典有2个(或3个,具体取决于你如何看待这 继续这篇文章: Performance hit incurred using NSMutableDictionary vs. NSMutableArray>

我正在尝试进行一些测试,以确定性能差距是否对NSArray和&amp ;;之间的读写非常有用. NSDictionary以及他们可变的coutnerparts ……

但是,我很难找到“平衡”测试…因为字典有2个(或3个,具体取决于你如何看待这个)对象循环以获取所寻找的值(而不是键),而数组只有一…

有什么建议?

– 如果您想了解更多细节:
我的意思是通过例子更容易解释;

对于数组:
(对于Nsstring * str in array){do smth with the string}

对于字典

(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.5s2.  9.1s3. 10.0s4.  9.8s5.  9.9s   -----    9.9s AvgNSArray,Fast Enumeration:1.  9.7s2.  9.5s3.  9.3s4.  9.1s5. 10.5s   -----    9.6s AvgNSDictionary,Block Enumeration1. 10.5s2. 10.6s3.  9.9s4. 11.1s5. 11.0s   -----   10.6s AvgNSDictionary,allKeys -> Fast Enumeration1. 10.0s2. 11.2s3. 10.2s4. 10.8s5. 10.8s   -----   10.6s AvgNSDictionary,allValues -> Fast Enumeration1. 10.7s2. 10.3s3. 10.5s4. 10.5s5.  9.7s   -----   10.3s Avg

从这个设计测试的结果可以看出,NSDictionary显然比NSArray慢(使用块枚举慢约7%,快速枚举慢7-10%).然而,这种比较是毫无意义的,因为使用NSDictionary的最快枚举只是简单地将它转换为数组.

所以最大的问题是,你为什么要考虑使用字典?数组和哈希表不完全可以互换;你有什么样的模型允许用NSDictionary直接替换NSArray?无论人工举例说明如何以某种方式证明性能优势,您都应该以一种有意义的方式实现模型 – 如果必须,您可以稍后优化性能.我不知道你将如何交替使用这些数据结构,但无论如何,NSArray在这里是赢家,特别是考虑到你试图访问值的顺序.

总结

以上是内存溢出为你收集整理的objective-c – 读取nsdictionary与nsarray的性能全部内容,希望文章能够帮你解决objective-c – 读取nsdictionary与nsarray的性能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1035221.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存