猜你喜欢
iOS和macOS性能优化

iOS和macOS性能优化

书籍作者: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 发布以来一直关注着它的发展,并保持有对新技术的热忱。目前就职于某国企负责项目管理工作,业余时间喜欢看书、跑步、烧菜,研究大前端技术栈,希望能通过自己的努力为国内的技术发展添砖加瓦。

编辑推荐
适读人群 :程序员,IT相关人员,程序开发

√从基本原理出发,了解苹果设备性能的常见陷阱和误解,解决苹果系统性能问题;

√理解优化原则、测量、工具、陷阱和技巧;

√了解什么时候要仔细优化,什么时候不值得花时间优化;

√平衡性能和封装,创建高效的对象表示、通信、数据访问和计算;

√避免拖慢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

标签
iOS