具体描述
随着应用功能的日益增加,性能问题也逐渐浮出水面,进入我们的视野之中。《iOS和macOS性能优化:Cocoa、Cocoa Touch、Objective-C和Swift》作者Marcel Weiher在性能调优领域有着丰富的经验,在他的带领下,你将会了解如何提升CPU、内存、I/O、图像、Swift等方面的性能,如何在开发过程中定位到性能的瓶颈和问题,他同时还介绍了性能优化的编程技巧和最佳实践,从而帮助你写出更高效、更快速的代码。此外,你还将学习到定位性能问题的工具使用方法以及最佳实践,并跟随示例来学习性能优化。
《iOS和macOS性能优化:Cocoa、Cocoa Touch、Objective-C和Swift》适合寻求进阶及所有对性能优化感兴趣的iOS 开发人员阅读。
作者简介
Marcel Weiher 是一名软件工程师和研究人员,拥有超过25 年的Cocoa 相关技术经验。Marcel 致力于性能优化相关的工作,曾在英国广播公司优化过世界上极繁忙的网络的性能,解决了当下机器上难以忍受的积压问题,而其在Apple 的Mac OS X 性能团队任职时,也帮助过其他工程师提高代码性能。
除了帮助知名公司和初创企业开发屡获殊荣的软件以及组建开发团队,Marcel 还教授课程,维护博客,出席会议演讲,为开源项目做贡献,并发明了如高阶消息传递等新技术。自1987 年开始,Marcel 着手Objective-C 的实现,开始从事与编程语言相关的工作,最终实现了Objective-Smalltalk 架构研究语言。Marcel 目前在柏林的微软公司担任首席软件工程师,并拥有自己的软件和咨询公司metaobject ltd。
目录信息
一个简单的例子 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
· · · · · · (收起)
读后感
用户评价
这本书对于资深开发者来说,无疑是一剂强心针,但更令我惊喜的是,它对初级开发者也展现出了极大的友好度。作者在引入复杂概念之前,总会用清晰的比喻或简单的代码片段来打好基础。例如,在讲解内存池(Memory Pooling)和对象复用(Object Reuse)时,他没有直接跳到复杂的C++模板,而是先用一个非常生动的“乐高积木”的比喻来解释对象创建和销毁的性能开销。这种循序渐进的教学方式,使得即便是刚刚接触性能优化概念的新手,也能建立起正确的性能思维框架。我的一位同事,刚入职不久,在阅读了本书关于运行时(Runtime)动态派发和虚函数表(Virtual Table)开销的章节后,对面向对象编程的底层机制有了全新的认识,这直接影响了他后续代码的结构选择。总而言之,它成功地将最尖端的性能调优技术,以一种既严谨又易于吸收的方式呈现了出来,是一本可以陪伴开发者职业生涯长期成长的宝藏之作。
我带着一种略微挑剔的眼光打开了这本书,毕竟市面上关于性能调优的书籍常常陷入泛泛而谈的窠臼。然而,这本书的表现彻底颠覆了我的预期。它在用户界面渲染(UI Rendering)的章节展现出的专业度,简直是教科书级别的。作者对 Core Animation 层的理解,以及如何精确控制图层重绘、避免不必要的离屏渲染(Off-Screen Rendering)的讲解,细致到了像素级别。我立刻尝试书中的几个技巧,例如如何利用 `CALayer` 的属性预设来减少运行时计算的开销,结果发现我们的一个复杂列表视图的滚动卡顿问题迎刃而解。更难能可贵的是,书中对不同iOS/macOS版本间API差异的说明也做了详尽的对比,这对于维护长期项目的开发者来说至关重要,避免了因版本迭代带来的隐性性能陷阱。阅读体验上,虽然内容专业,但行文流畅,没有那种晦涩难懂的工程师黑话,作者成功地在深度和易读性之间找到了完美的平衡点,让人愿意一气呵成读下去,而不是遇到难点就望而却步。
这本书的价值远超乎一本技术手册的范畴,它更像是一部关于“软件哲学”的著作。作者在谈论性能优化时,始终强调“用户感知”的重要性。书中花了不少篇幅讨论如何衡量“流畅度”,区分“可接受的延迟”和“用户无法忍受的卡顿”,这种以用户体验为核心的思维导向,让我重新审视了过去许多只追求“跑分高”的优化工作。比如,书中关于后台任务调度和能耗管理的论述,清晰地阐明了速度与电池寿命之间的微妙关系。我们过去常常为了追求瞬间的响应速度而过度唤醒CPU,导致电量迅速下降,而这本书教会了我如何设计一个更具可持续性的性能策略。对于那些希望从“代码实现者”晋升为“系统架构师”的读者来说,这种宏观的视角和全局的权衡思想,是任何单一工具文档都无法提供的。它教会我的,是如何在资源有限的移动设备上,设计出既快速又“绿色”的应用。
这本《iOS和macOS性能优化》的深度实在令人印象深刻。我原本以为自己对Apple平台的性能调优已经有了一定的了解,但这本书简直像是一张藏宝图,揭示了许多我之前从未涉足的领域。从底层内存管理的细微差别,到Metal API的高效使用,再到Grand Central Dispatch(GCD)的并发模型优化,作者的讲解都深入浅出,逻辑严密。特别是关于启动时间优化那一章,书中不仅罗列了常见的耗时点,更提供了可操作的Profiling工具链和具体的代码重构策略,这对于我们团队来说是立竿见影的宝贵财富。我特别欣赏作者没有停留在理论层面,而是大量穿插了真实的案例分析和解决方案,那些关于如何通过 Instruments 追踪到隐藏的性能瓶颈,并最终将其转化为可量化的性能提升的叙述,读起来酣畅淋漓。这本书不仅仅是告诉你“为什么会慢”,更重要的是教你“如何让它快起来”,并且是那种“慢工出细活”的扎实优化,而不是简单的表面修补。我感觉自己像是被领进了一个高级工程师的私密研讨会,学到的都是干货。
说实话,我平时很少读这么厚的专业书籍,但我发现自己竟然会时不时地把《iOS和macOS性能优化》当作参考手册来翻阅。其中关于网络层性能优化的章节,特别让我眼前一亮。它没有停留在简单的HTTP请求优化,而是深入到了TCP握手、TLS建立效率,甚至如何利用Content Delivery Network(CDN)的边缘计算特性来减少数据往返延迟的策略。对于开发跨国业务的应用来说,这些细节是决定用户体验生死的关键。我尤其喜欢作者对异步编程模型中“锁竞争”的分析,那部分内容极其严谨,用图示和伪代码清晰地展示了如何通过无锁数据结构(Lock-Free Data Structures)来最大化多核处理器的并行能力,极大地减少了多线程环境下不必要的等待时间。读完这一部分,我立刻着手重构了我们应用中一个长期存在的并发瓶颈,效果立竿见影,系统的吞吐量得到了显著提升,这是之前所有优化尝试都未能达到的高度。
有些地方真的不错,但是所用的一些优化技术现在看来已经不需要了或者有更好的做法了。推荐阅读
有些地方真的不错,但是所用的一些优化技术现在看来已经不需要了或者有更好的做法了。推荐阅读
GG翻译组翻译的,质量很走心。作者的度量方式来对性能调优很值得借鉴
GG翻译组翻译的,质量很走心。作者的度量方式来对性能调优很值得借鉴
有些地方真的不错,但是所用的一些优化技术现在看来已经不需要了或者有更好的做法了。推荐阅读