|
|
51CTO旗下网站
|
|
移动端

Foundation 对象和基本类型对比

《iOS和macOS性能优化:Cocoa、Cocoa Touch、Objective-C和Swift》第7章内存:陷阱和优化技巧,本章将围绕这个话题来进行讨论。除此之外,我们将展示一些陷阱,尤其是在Objective-C 代码中经常出现的问题。本节为大家介绍Foundation 对象和基本类型对比。

作者:李俊阳 等译来源:电子工业出版社|2018-07-17 16:29

Foundation 对象和基本类型对比

我们已经在第3 章中了解了Foundation 和Core Foundation 对象,尽管在某些情况下使用它们非常方便,但是也会导致显著的CPU 性能损耗,因此毫无疑问,它也存在着显著的内存性能损耗。

表示float 的NSNumber 对象的大小为32 字节,而float 本身只有4 个字节的大小,所以它的大小整整扩展了8 倍。这个倍数同样也适用于其他基本类型的封装。不过,64 位运行时中表示整数的NSNumber 或者CFNumber 对象则是例外,正如我们在第3 章“基本类型”一节中所探讨的那样。它们会为对象指针本身进行编码,所以不会占用额外的存储空间。

说到指针,所有的对象表征方式也使用了指向内存的指针,无论该引用持有的是结构体还是对象,因此在32 位系统中会多出4 个字节,而在64 位系统中会多出8 个字节。在之前的比较中,并没有考虑这个因素,所以对于指针而言,基本的float 类型和NSNumber 之间的区别实际上一个是4 字节,而另一个是40 字节,它们之间的差异扩大到了 10 倍。图 7.3 比较了 Rectangle 对象在使用 4 个基本类型和 4 个(简化的)NSNumber 对象之间的内存布局差异。每个方框都表示了8 个字节的宽度,而使用基本类型的Rectangle 对象总共使用了24 个字节,因此它可以放到单个64 字节长的高速缓存行中,从而在单个内存读写事务中进行读取。而使用了NSNumber 的Rectangle对象并不是简单地将原来的基本对象大小增加到 40 字节,它还需要 4 个已分配(malloced)的额外内存块,每个值都很可能需要不同的高速缓存行来处理。

在第3 章的“数组和批处理”一节中,我们可以看到浮点指针数均匀分布的数组,比NSNumber 对象均匀分布的NSArray 对象要快上5 到1000 倍。现在可以看到,基于运行环境(32 位或者64 位)和数值表示方法(float 或者double)的不同,它们之间的速度差异也有5 到10 倍左右。在“数组和批处理”一节中,提到尺寸的不同与性能基准并无关联,这是因为数组的大小相对较小,并且也没有进行其他操作,在真实场景中,几乎可以完全肯定:它对性能会有额外的影响。首先,就数组的大小而言,高速缓存命中丢失的可能性很可能会增加10 倍;第二,单独分配NSNumber 对象意味着很难去使用快速顺序存取模式,因为每个NSNumber 都可能会分配到堆的不同地方。

正如你所猜想的那样,使用字典存取甚至会更加糟糕。假设有一个只包含单独条目的可变NSDictionary,这个条目假设是NSKernAttributeName 和-0.2 的一对键值。我在 64 位系统中进行的测量时,发现字典本身占据了 112 个字节,此外还有NSNumber 所占据的32 个字节。我并没有将NSString 这个键的大小计算在内,因为几乎可以肯定这个字符串是共享的,但是这总共还是占据了 144 个字节。如果有一个具有kern 浮点值的对象,那么这个对象实际所占据的总大小将是12 个字节,此外还包含malloc 内存块占据的32 个字节。使用存取模式会更加糟糕;哈希函数总会保证访问是随机的,因此访问时间的损耗将变得非常大。

NSDictionary 通常被看作一个用结构疏散来节省内存的手段,但是事实证明,它本身是很难拆分的,甚至还会带来更大的初始空间占用。图7.4 展示了具体的区别:与直接用对象表征方式相比,只有当数据的利用率低于 5%甚至更低,且数据量超过 100个以上的时候,用NSDictionary 所占用的空间才会更少。如果字典使用率比较高,或者存储的数据比较少,那么对象表征方式占据的空间更小,即便所有的这些数据看似“无用”,甚至使用率仅仅只有 10%,基于NSDictionary 表述方式的空间增长斜率也更陡峭。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

SQL Server 2005数据挖掘与商业智能完全解决方案

本书以BI解决方案的体系结构为中心,以SQL Server 2005为载体,将着眼点放在数据挖掘和商业智能上,详细讲解了数据报表、数据分析和数据挖...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊