软件系统优化

本书详细介绍了软件系统优化的原理、技术和常用方法,强调系统优化应具备从单点到全局的“系统观”,提出了“数据驱动的系统优化”方法,围绕“软件+硬件+数据”三个方面展开讲解。本书共 18 章,分为五个部分。第一部分包括第 1 章和第 2 章,从一个性能优化案例引入,概述了软件系统优化的方法论。第二部分包括第 3 $\sim$ 6 章,介绍了性能工程的基础知识。第三部分包括第 7 $\sim$ 10 章,介绍计算机体系结构优化的相关知识。第四部分包括第 11 $\sim$ 16 章,介绍编译优化的相关知识。第五部分包括第 17 章和第 18 章,针对新兴场景下的系统优化技术展开专题讨论。

本书内容全面,体系完整,适合作为高校计算机及相关专业高年级本科生、研究生的教材,也可作为从事系统优化工作的技术人员的参考书。

购买链接

本书由机械工业出版社出版,欢迎通过淘宝京东等网上平台选购。

教材配套资料

教材示例代码

软件系统优化配套代码仓库@Github

教学计划与课程资料

包含 PDF 版本的理论教学课件、上机作业与实践项目。

理论课 实践课
模块 主题 上机作业(2 周 / 个) 实践项目(4 周 / 个)
1 绪论 [PDF] 矩阵乘法优化案例
2 方法论概述
3 性能工程基础 性能测量 [PDF] A1 初试环境和工具 [PDF]
4 基准评测 [PDF] A2 SPECjvm2008 基准测试 [PDF] P1 矩阵乘法自动调优器 [PDF]
5 配置优化 [PDF] A1 提交
6 性能评价 [PDF] A2 提交
A1 反馈和检查
7 计算机体系结构优化 处理器优化 [PDF] A2 反馈和检查
8 存储器优化 [PDF] P1 提交
9 微体系结构性能分析 [PDF] P2 剖析合并排序 [PDF]
P1 反馈和检查
10 异构计算与编程 [PDF] A3 oneAPI 异构编程 [PDF]
11 编译优化 源程序级别的常见优化方法 [PDF]
12 编译器概述 [PDF] A4 GCC 与 Clang/LLVM 优化比较 [PDF]
A3 提交
P3 交叉编译与跨平台应用仿真 [PDF]
13 目标指令集架构及汇编语言 [PDF] A3 反馈和检查 P2 提交
14 C 程序的汇编代码生成 [PDF] A4 提交 P2 反馈和检查
15 编译器的优化能力 [PDF] A5 向量化 [PDF]
A4 反馈和检查
16 程序插桩及优化机会识别 [PDF] P3 提交
17 专题讨论 数据中心的性能优化 [PDF] A5 提交 P3 反馈和检查
18 深度学习框架的优化 [PDF] A5 反馈和检查

勘误

本页面持续更新,如果您有任何意见、建议或者评论,欢迎通过邮箱 [email protected] 进行反馈。

文本勘误

页码 位置 原文 更正
68 第 13 行 ……假设实验误差 $e$ 符合标准正态分布 $N(0, \sigma^2)$…… ……假设实验误差 $e$ 符合正态分布 $N(0, \sigma^2)$……

代码勘误

印刷版的代码可能有较多空格/缩进问题,这里尽可能地列出我们发现的错误之处,敬请读者谅解。完整的代码可参考配套代码库。

页码 位置 原文 更正
3 代码 1.1,第 13 行 C[i][j] += A[i][k] * B[k][i] C[i][j] += A[i][k] * B[k][j]
3 代码 1.1,第 16 行 print("% .2f" % (end - start)) print("%.2f" % (end - start))
4 代码 1.2,第 30 行 System.out.printf("%.2f\n" , tdiff); System.out.printf("%.2f\n", tdiff);
4 代码 1.3,第 10 行 float tdiff(struct timeval *start , struct timeval *end) { float tdiff(struct timeval *start, struct timeval *end) {
4 代码 1.3,第 29-30 行 缩进为 16 字符 缩进为 12 字符
5 代码 1.3,第 36 行 printf("%.2f\n", tdiff (&start, &end)); printf("%.2f\n", tdiff(&start, &end));
6 代码 1.4,第 15 行 int main(int argc , const char *argv[]) { int main(int argc, const char *argv[]) {
7 代码 1.4,第 36 行 printf("%.2f\n", tdiff (&start - &end)); printf("%.2f\n", tdiff(&start - &end));
10 代码 1.6,第 16 行 int main(int argc, const char *argv []) { int main(int argc, const char *argv[]) {
13 代码 1.7,第 16 行 int main(int argc, const char *argv []) { int main(int argc, const char *argv[]) {
14 代码 1.8,第 11 行 float tdiff(struct timeval *start , struct timeval *end) { float tdiff(struct timeval *start, struct timeval *end) {
16 代码 1.9,第 21 行 int main(int argc, const char *argv []) { int main(int argc, const char *argv[]) {
27 代码 3.1,第 29 行 printf("Found %d prime(s) in interval [%d , %d] .\n", count, start, end); printf("Found %d prime(s) in interval [%d, %d].\n", count, start, end);
31 代码 3.3,第 1 行 #include <sys/time .h> #include <sys/time.h>
35 上方代码块,第 4 行 Performance counter stats for './prime 1 20000000 ': Performance counter stats for './prime 1 20000000':
39 下方代码块,第 3 行 $ $./count_primes_parallel <start> <end> 删去第一个 $