书海网短评:
适读人群:程序员,IT相关人员,程序开发√从基本原理出发,了解苹果设备性能的常见陷阱和误解,解决苹果系统性能问题;√理解优化原则、测量、工具、陷阱和技巧;√了解什么时候要仔细优化,什么时候
√从基本原理出发,了解苹果设备性能的常见陷阱和误解,解决苹果系统性能问题;
√理解优化原则、测量、工具、陷阱和技巧;
√了解什么时候要仔细优化,什么时候不值得花时间优化;
√平衡性能和封装,创建高效的对象表示、通信、数据访问和计算;
√避免拖慢Objective-C程序和阻碍后续优化的错误;
√修复内存和资源管理中的漏洞和其他问题;
√解决与驱动器、网络、序列化和SQLite相关的I/O问题;
√了解代码绘图和不会对有限的iOS设备资源造成太大负担的用户界面;
√所有开发人员都需要了解的关于Swift的性能信息。
随着应用功能的日益增加,性能问题也逐渐浮出水面,进入我们的视野之中。《iOS和macOS性能优化:Cocoa、Cocoa Touch、Objective-C和Swift》作者MarcelWeiher在性能调优领域有着丰富的经验,在他的带领下,你将会了解如何提升CPU、内存、I/O、图像、Swift等方面的性能,如何在开发过程中定位到性能的瓶颈和问题,他同时还介绍了性能优化的编程技巧和*佳实践,从而帮助你写出更高效、更快速的代码。此外,你还将学习到定位性能问题的工具使用方法以及*佳实践,并跟随示例来学习性能优化。《iOS和macOS性能优化:Cocoa、Cocoa Touch、Objective-C和Swift》适合寻求进阶及所有对性能优化感兴趣的iOS开发人员阅读。
MarcelWeiher是一位在Cocoa技术方向上有超过25年经验的软件工程师和研究员。Marcel的工作一直聚焦在性能优化上,包括在BBC解决不可能的预压榨问题,和在Apple的MacOSX性能团队帮助其他Apple工程师提升代码的性能。除了帮助知名公司和新兴公司创建了成功的软件,帮助开发团队,Marcel也会做培训课程,分享博客,在会议上做演讲,贡献开源项目,并开发像HigherOrderMessageing这样的新技术。他也致力于开发语言的研究,从1987年开始做Objective-C的实践,最后研究了Objective-Smalltalk。Marcel目前是柏林Microsoft的首席软件工程师,维护已有的软件,并为公司提供咨询顾问。
李俊阳(星夜暮晨),Realm中文翻译,SwiftGG翻译组核心成员,《Xcode江湖录》作者之一。沉迷Swift,自Swift发布以来一直在探索和学习Swift的开发和使用;热爱开源,多次向Swift、RealmCocoa开源库贡献代码;喜欢独辟蹊径,目前在AppStore上架了专门为彝族同胞开发的「彝文输入法」,希望通过自己的努力让所有人都能享受科技带来的便利。
马超,iOS开发工程师,目前就职于某金融公司手机炒股部门,SwiftGG翻译组核心成员。自Apple推出Swift语言之后开始学习并应用到iOS项目开发中,已上架多款应用到AppStore,目前专注于Server-SideSwift的开发,正在构思实现一个底层开源库;业余时间喜欢逛技术博客,翻译外文以及和技术大牛交流学习。新浪微博@Ninth_Day。
程伟,SwiftGG翻译组核心成员,曾做过路由器、防火墙等安全硬件产品的firmware研发工作,对iOS开发也颇有研究,自Swift发布以来一直关注着它的发展,并保持有对新技术的热忱。目前就职于某国企负责项目管理工作,业余时间喜欢看书、跑步、烧菜,研究大前端技术栈,希望能通过自己的努力为国内的技术发展添砖加瓦。
目录
1CPU:原理1
一个简单的例子2
(微)基准的危险3
更多整数求和的方式4
Swift5
其他语言7
混编的力量9
趋势10
操作成本12
复杂度计算14
总结16
2CPU:测量和工具17
命令行工具18
top18
time19
sample19
Xcode测量工具22
Instruments23
设置和数据收集24
性能分析选项25
基本分析27
源代码29
数据挖掘I:Focus31
数据挖掘II:Pruning34
内部测量35
测试36
dtrace(dynamictracing,动态跟踪)37
职责之外的优化38
总结39
3CPU:陷阱和优化技巧41
数据表示41
基本类型42
字符串45
对象47
存取器48
公共访问(PublicAccess)51
对象创建和缓存52
可变性和缓存53
惰性求值55
缓存注意事项55
陷阱:通用(中级)表示57
数组和批处理58
字典60
消息传递63
IMP缓存65
转发67
均匀性和优化69
方法70
陷阱:CoreFoundation70
多核71
线程(Thread)72
工作队列73
有节制地优化74
4CPU实战:XML解析77
HTML扫描器78
将回调映射为消息81
对象83
对象的高效性能85
性能评估88
调整91
优化整个组件:MAX92
MAX实现94
总结95
5内存:原理97
内存层次结构97
Mach虚拟内存103
堆和栈104
栈分配106
使用malloc()进行堆分配108
资源管理111
垃圾回收111
Foundation对象所有权112
跟踪垃圾回收113
自动引用计数(AutomaticReferenceCounting)114
过程式资源回收115
总结115
6内存:测量与工具117
Xcode计量表117
命令行工具118
top118
heap120
leaks及malloc_debug122
代码内进行内存测量123
内存监测工具124
Leaks124
Allocations125
VMTracker132
计数器与性能监测事件133
总结134
7内存:陷阱和优化技巧137
引用计数137
避免内存泄漏139
Foundation对象和基本类型对比141
更小的结构143
千禧危机145
压缩145
可清除内存146
内存与并发146
架构注意事项147
临时分配与对象缓存152
NSCache与libcache153
内存映射文件154
madvise157
iOS注意事项158
ARC优化158
总结161
8内存管理实战:FilterStream架构163
UNIX管道及过滤器163
面向对象的过滤器165
DescriptionStream166
消除description中的无限递归170
数据流层次结构172
总结173
9Swift175
Apple所声称的Swift性能175
语言特性177
基准代码179
Swift性能评估180
基本性能特征180
集合181
更进一步190
NginxHTTP解析器190
FreddyJSON解析器191
图片处理191
观察192
编译时间193
类型推断193
泛型特化195
全模块优化197
控制编译时间197
面向优化器编程198
一个足够智能的编译器199
优化编译器之死201
实用建议203
备用方案204
总结207
10I/O:原理209
硬件209
硬盘驱动器209
固态硬盘211
网络212
操作系统212
抽象概念:字节流212
文件I/O214
网络栈218
总结218
11I/O:测量与工具221
负形空间:top与time222
信息概览:iostat和netstat223
Instruments224
详细追踪:fs_usage228
总结231
12I/O:陷阱和优化技巧233
将字节封装为NSData233
内存映射异常235
如何分块237
UNIXyI/O238
网络I/O240
堆叠传输241
限制请求243
数据处理244
异步I/O245
HTTP服务246
序列化250
内存转储251
一个简单的XML格式252
属性列表254
归档256
序列化总结258
CoreData260
批量创建和更新261
Fetch和Fault技术263
对象交互266
子集266
分析267
SQLite267
关系型和其他非数据库269
事件发布270
混合形式271
隔离存储272
总结272
13I/O:实战273
iPhone游戏字典273
有趣的属性列表277
二进制属性列表读取器278
懒加载282
避免中间代码284
逗号分隔值287
公共交通调度数据289
站点信息290
站点停靠时间检索291
站点停靠时间导入292
更快的CSV解析294
对象分配294
Push与Pull的比较296
感兴趣的键296
并行296
总结299
14图像和UI:原理301
响应能力301
软件和API302
Quartz和PostScript图像模型305
OpenGL307
Metal307
图形硬件加速307
从Quartz到CoreAnimation311
总结314
15图像和UI:测量和工具315
CPU分析仪315
Quartz调试317
CoreAnimation工具318
当CPU不再是问题319
我在测量什么327
总结329
16图像和UI:陷阱和优化技巧331
陷阱331
优化技巧332
过多通信导致安装缓慢333
节流显示333
使用节流显示335
今日安装程序和进度报告335
iPhone无法承受之重336
一切都是假象338
图像的缩放和剪切338
缩略图绘制340
如何确定没有绘制缩略图341
如何真的不绘制缩略图341
如何绘制非缩略图342
在iPhone上绘制直线344
总结346
17图像和UI:实战347
优美的天气应用347
更新348
探索PNG348
头脑风暴350
JPEG数据点350
测量时的小错误351
JPNG与JPJP353
优美的启动353
Wunderlist3354
Wunderlist2354
整体架构355
URI与进程中REST356
最终一致的异步数据存储357
RESTOperation队列358
流畅、反应灵敏的UI359
简评Wunderlist361
总结361
译者序
我们在开发应用的时候,最关心的都是些什么呢?首要的自然就是功能需求了,此外还有那些炫酷的用户界面和转场动画。当我们进入书店,或者在网上搜索时,映入眼帘的普遍都是开发入门、功能需求、动画特效等诸如此类的书籍和文章。那么,我们何时才会关注那些所谓的“非功能性需求”呢?
在我们翻译的上一《iOS和macOS性能优化:Cocoa、Cocoa Touch、Objective-C和Swift》《iOS应用安全权威指南》中,我们很高兴地看到了iOS开发中关于“安全性”需求的话题。在《iOS和macOS性能优化:Cocoa、Cocoa Touch、Objective-C和Swift》中,我们将继续关注“性能和可靠性”这一非功能性需求。
提到性能,我们通常想到的是后台的服务器性能和网络带宽。在出现性能问题的时候,我们会想方设法地提升后台服务器的性能,增加CPU内核、增加内存、增加网络带宽……但是有没有想过,有时候应用本身的性能也会阻碍用户数量的增长,甚至严重影响用户体验。试想,如果用户在使用应用的时候,出现了严重的卡顿,这种情况对于用
户而言往往是无法忍受的。这对很多公司而言,致命性不言而喻。更严重的是,应用一旦出现了性能问题,我们是没办法通过增加CPU内核、内存等方法来进行提升的。因此,我们需要对应用进行性能调优。
但是,目前市面上关于iOS性能优化的文章和书籍实在是少之又少,我们通常会看到人们用Instruments的Allocations、Leaks等工具来检查性能问题,但是它们的具体用法是怎么样的呢?我们要怎样做才能找到应用真实的性能瓶颈呢?有哪些问题是通过编写代码本身就可以规避的呢?这些,《iOS和macOS性能优化:Cocoa、Cocoa Touch、Objective-C和Swift》都能够告诉你。
我们相信,每位软件开发者都有一种精益求精、追求卓越的心态和想法,在我们完成了庞杂的功能需求之后,自然就会开始关注如何提升用户体验,其中就包括性能优化。无论你的应用规模如何,我们都强烈建议大家阅读《iOS和macOS性能优化:Cocoa、Cocoa Touch、Objective-C和Swift》,掌握一些基本的技巧,只要在开发过程中规避这些陷阱和漏洞,那么基本上我们的应用就能够满足性能的要求,在绝
大多数时间,使你完全没必要担忧性能的相关问题。
我们都知道,Xcode拥有一个简单的性能检测窗口DebugNavigator,其中分别展示了CPU、内存、硬盘、网络的使用量等。类似地,《iOS和macOS性能优化:Cocoa、Cocoa Touch、Objective-C和Swift》包含如下四部分内容:CPU、内存、I/O,以及图像处理和响应速度。每部分内容都同时包括了基本的理论知识、测量的工具和度量标准、常见的问题和处理方法,以及真实的案例演示。内容循序渐进,由浅
至深,无论你是急于寻找性能问题的解决方案,还是想要系统化地学习性能调优的相关知识,都能够依据这个完整的架构体系寻找到想要的内容。
在《iOS和macOS性能优化:Cocoa、Cocoa Touch、Objective-C和Swift》翻译过程中,由于书中的内容对于我们而言也比较新颖,在百忙之余,我们也一一根据书中的案例和步骤先行学习、试验和体会,以期能够用更为准确的语言和文字,将书中的思想完整地分享给各位读者朋友。在此也特别感谢参与校对的SwiftGG翻译组的小伙伴们,对我们在翻译过程中出现的错误进行了勘正。同时也感谢电子工业出版社的编辑、审稿专家,他们认真负责、高效细心地进行了编辑和校对,也给我们提出了不少好的建议。当然,由于《iOS和macOS性能优化:Cocoa、Cocoa Touch、Objective-C和Swift》用到了大量的专业术语,在中文世界中找不到相应的描述,因此我们也斗胆“创造”了很多新词,如果出现了缺漏、不准确、不到位的情况,还请各位读者批评指正。
最后,再次感谢你关注这本讲解性能优化的书籍,我们相信你一定能从这《iOS和macOS性能优化:Cocoa、Cocoa Touch、Objective-C和Swift》中学习到各种有用的知识,向进阶的iOS开发者更进一步!
李俊阳
2018年3月3日
前言
性能是软件极其重要的特性之一。若没有世界一流的性能,软件也就称不上是世界级的。长期以来,硬件的改善意味着担心软件的性能似乎是浪费时间的,但随着摩尔定律不再自然而然地提供显著的自动性能改进,性能优化也逐步回到了计算机科学和工程的前沿。
此外,尽管底层硬件的性能已经提升了很多倍,但终端用户对性能提升的感知似乎并不明显。比尔·盖茨认为“软件的速度每18个月就会变慢一半”,同样在APleaforLeanSoftware(《为软件瘦身请命》)一文中提出的维尔特定律还认为,“软件变慢的速度永远快过硬件变快的速度”。
iPad面世之初,行业资深人士被其流体式的布局界面所惊艳,但同时不得不接受一个只配备了1GHz的CPU,这是让人感到遗憾的一点。不过,那时的iPad比我的AppleII快了1000多倍,比大屏的NeXTCube也要快40倍。如果真的有什么值得诧异的,那就是在使用GPU处理屏幕渲染的时候,它居然没怎么变快。
《iOS和macOS性能优化:Cocoa、Cocoa Touch、Objective-C和Swift》将尝试在Objective-C、Cocoa和CocoaTouch的背景下深入了解这些发展的根本原因,并尝试提供技术,帮助我们充分利用计算机惊人的原始力量——那些易于肆意挥霍的力量。我会试图告知何时挥霍计算机的性能是恰当的,以及何时需要对性能引起高度重视。程序员的注意力也是一种稀缺资源,但却经常浪费在尝试优化无关紧要的部
分程序上。
主题将涵盖延迟与带宽,处理事项成本损耗(开销)与实际完成工作的对比,其具有普遍性,且硬件和软件栈的表现形式随级别不同而不同。
你可能注意到任何单一的操作时间取决于机器的速度,而机器总是足够快的,因此得出关键方程项目数?损耗。大多数优化是减少公式的一部分或两部分,通常我们要先尝试将其分解。
降低成本损耗的一种常用方法:认识到损耗实际上是由损耗1和损耗2两个独立的成本组成的,并且两者之中有且仅有一个需要应用于所有项目——项目数×(损耗1+损耗2)→损耗1+项目数×损耗2。我称之为基本优化方程,大部分优化技术均属于这一类,它也是构成我们每天处理的大多数硬件/软件栈的基础。
《iOS和macOS性能优化:Cocoa、Cocoa Touch、Objective-C和Swift》有一个非常规则的目录结构,将依次讨论性能的4个基本主题领域:
1.CPU的性能
2.内存
3.I/O
4.图像和响应速度
尽管已经努力保证每个主题领域的独立性,但是逻辑之间千丝万缕,因此对基础的主题有一定了解有助于对后续主题的理解。
上述4个主题分别又被划分成4个特定的兴趣领域,如下。
1.原理。
2.测量和工具。
3.陷阱和优化技巧。
4.实战演示应用技术。
再次强调,我们将遵循这样一个逻辑结构:在进行实际的性能优化技术之前,你需要了解一些理论知识并知道如何测量,同样地,如果基本熟悉前面几个话题,应该也能够深入感兴趣的特定领域。
《iOS和macOS性能优化:Cocoa、Cocoa Touch、Objective-C和Swift》采用这种结构划分成了4?4=16章,加上内存和I/O之间穿插的特别章节Swift,总计17章。Swift在整《iOS和macOS性能优化:Cocoa、Cocoa Touch、Objective-C和Swift》中被广泛使用,其独特的性能特点值得我们新开一章来讨论。
对我而言,软件性能是一种激情和呼唤,贯穿了我的整个职业生涯。关于性能,我深有体会,性能无法自动优化,我们也无法在最后时刻弃它而去。另一方面,不要过分担心性能,才能集中精力在真正需要的性能工作上。这并非自相矛盾,设定一个合理的基础性能水平,通常情况下软件都是能够达到的,这样就免去了大部分时间都在对性能担忧的困扰。
简而言之,《iOS和macOS性能优化:Cocoa、Cocoa Touch、Objective-C和Swift》是关于如何出色完美地提升软件执行效率的一《iOS和macOS性能优化:Cocoa、Cocoa Touch、Objective-C和Swift》。









