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