书籍详情
C++高性能编程
作者:[美]费多尔·G.皮克斯 著 刘鹏 译
出版社:清华大学出版社
出版时间:2022-11-01
ISBN:9787302620693
定价:¥139.00
购买这本书可以去
内容简介
《C高性能编程》详细阐述了与C高性能编程相关的基本解决方案,主要包括性能和并发性简介,性能测量, CPU架构、资源和性能,内存架构和性能,线程、内存和并发,并发和性能,并发数据结构,C中的并发,高性能C,C中的编译器优化,未定义行为和性能,性能设计等内容。此外,本书还提供了相应的示例、代码,以帮助读者进一步理解相关方案的实现过程。 本书适合作为高等院校计算机及相关专业的教材和教学参考书,也可作为相关开发人员的自学用书和参考手册。
作者简介
暂缺《C++高性能编程》作者简介
目录
第1篇 性 能 基 础
第1章 性能和并发性简介 3
1.1 程序员要关注性能的原因 3
1.2 有关性能重要性的解释 6
1.3 程序性能 8
1.3.1 吞吐量指标 8
1.3.2 功耗指标 9
1.3.3 实时应用性能 10
1.3.4 上下文环境 11
1.4 评估和预测性能 12
1.5 精通高性能应用程序开发 13
1.6 小结 14
1.7 思考题 15
第2章 性能测量 17
2.1 技术要求 17
2.2 性能测量示例 18
2.3 性能基准测试 25
2.3.1 C 计时器 25
2.3.2 高分辨率计时器 26
2.4 性能分析 31
2.4.1 perf性能分析器 32
2.4.2 使用perf 进行详细性能分析 34
2.4.3 Google Performance性能分析器 37
2.4.4 使用调用图进行性能分析 38
2.4.5 优化和内联 42
2.4.6 实际性能分析 44
2.5 微基准测试 45
2.5.1 微基准测试的基础知识 45
2.5.2 微基准测试和编译器优化 48
2.5.3 Google Benchmark 51
2.5.4 微基准测试是谎言 54
2.6 小结 58
2.7 思考题 59
第3章 CPU架构、资源和性能 61
3.1 技术要求 61
3.2 CPU和性能 62
3.3 使用微基准测试性能 64
3.4 可视化指令级并行性 70
3.5 数据依赖和流水线 72
3.6 流水线和分支 77
3.6.1 分支预测 80
3.6.2 分支预测错误的性能分析 82
3.7 推测执行 85
3.8 复杂条件的优化 86
3.9 无分支计算 90
3.9.1 循环展开 90
3.9.2 无分支选择 91
3.9.3 无分支计算示例 93
3.10 小结 96
3.11 思考题 97
第4章 内存架构和性能 99
4.1 技术要求 99
4.2 影响性能的不止CPU 100
4.3 测量内存访问速度 102
4.3.1 内存架构 103
4.3.2 测量内存和缓存速度 105
4.4 内存的速度:数字 108
4.4.1 随机内存访问速度 108
4.4.2 顺序内存访问速度 111
4.4.3 硬件中的内存性能优化 113
4.5 优化内存性能 115
4.5.1 高效使用内存的数据结构 116
4.5.2 分析内存性能 119
4.5.3 优化内存性能的算法 121
4.6 机器里的“幽灵” 126
4.6.1 关于Spectre 127
4.6.2 Spectre攻击示例 129
4.6.3 释放“幽灵” 133
4.7 小结 137
4.8 思考题 137
第5章 线程、内存和并发 139
5.1 技术要求 139
5.2 理解线程和并发 139
5.2.1 关于线程 140
5.2.2 对称多线程 141
5.2.3 线程和内存 141
5.2.4 内存受限程序和并发 145
5.3 了解内存同步的成本 146
5.4 数据共享成本高昂的原因 151
5.5 了解并发和顺序 157
5.5.1 顺序的需要 157
5.5.2 内存顺序和内存屏障 159
5.5.3 C 中的内存顺序 165
5.6 内存模型 168
5.7 小结 172
5.8 思考题 172
第2篇 并发的高级应用
第6章 并发和性能 175
6.1 技术要求 175
6.2 高效使用并发需要的条件 176
6.3 锁、替代品及其性能 177
6.3.1 基于锁、无锁和无等待的程序 179
6.3.2 针对不同问题的不同锁 181
6.3.3 锁与无锁的真正区别 185
6.4 并发编程的构建块 187
6.4.1 并发数据结构的基础知识 188
6.4.2 计数器和累加器 191
6.4.3 发布协议 196
6.5 并发编程的智能指针 198
6.5.1 发布指针 198
6.5.2 原子共享指针 201
6.6 小结 204
6.7 思考题 204
第7章 并发数据结构 205
7.1 技术要求 205
7.2 关于线程安全数据结构 205
7.2.1 最好的线程安全性 206
7.2.2 真正的线程安全性 208
7.3 线程安全栈 208
7.3.1 线程安全的接口设计 209
7.3.2 互斥锁保护的数据结构的性能 211
7.3.3 不同用途的性能要求 213
7.3.4 有关栈性能的细节讨论 217
7.3.5 同步方案的性能估计 220
7.3.6 无锁栈 223
7.4 线程安全队列 229
7.4.1 无锁队列 230
7.4.2 非顺序一致的数据结构 235
7.4.3 并发数据结构的内存管理 238
7.5 线程安全列表 240
7.5.1 列表的挑战 240
7.5.2 无锁列表 243
7.6 小结 249
7.7 思考题 249
第8章 C 中的并发 251
8.1 技术要求 251
8.2 C 11中的并发支持 251
8.3 C 17中的并发支持 253
8.4 C 20中的并发支持 256
8.4.1 协程的基础知识 257
8.4.2 协程C 语法 261
8.4.3 协程示例 262
8.5 小结 268
8.6 思考题 269
第3篇 设计和编写高性能程序
第9章 高性能C 273
9.1 技术要求 273
9.2 关于编程语言的效率 273
9.3 不必要的复制 275
9.3.1 复制和参数传递 275
9.3.2 将复制作为一种实现技术 277
9.3.3 复制以存储数据 278
9.3.4 复制返回值 279
9.3.5 使用指针避免复制 283
9.3.6 避免不必要的复制 284
9.4 低效的内存管理 285
9.4.1 不必要的内存分配 285
9.4.2 并发程序中的内存管理 289
9.4.3 避免内存碎片 290
9.5 条件执行的优化 293
9.6 小结 295
9.7 思考题 296
第10章 C 中的编译器优化 297
10.1 技术要求 297
10.2 编译器优化代码 297
10.2.1 有关编译器优化的基础知识 298
10.2.2 函数内联 300
10.2.3 编译器真正知道的东西 305
10.2.4 将运行时信息转换为编译时信息 311
10.3 小结 314
10.4 思考题 315
第11章 未定义行为和性能 317
11.1 技术要求 317
11.2 关于未定义行为 317
11.3 产生未定义行为的缘由 320
11.4 未定义行为和C 优化 321
11.5 使用未定义行为进行高效设计 330
11.6 小结 333
11.7 思考题 334
第12章 性能设计 335
12.1 技术要求 335
12.2 设计与性能之间的相互作用 335
12.3 着眼于性能的设计 336
12.3.1 最小信息原则 337
12.3.2 最大信息原则 338
12.4 API设计注意事项 344
12.4.1 有关并发的API设计 344
12.4.2 复制和发送数据 349
12.5 优化数据访问的设计 351
12.6 性能权衡 354
12.6.1 接口设计 354
12.6.2 组件设计 355
12.6.3 错误和未定义的行为 356
12.7 做出明智的设计决策 357
12.8 小结 359
12.9 思考题 359
附录 思考题解答 361
第1章 性能和并发性简介 361
第2章 性能测量 361
第3章 CPU架构、资源和性能 362
第4章 内存架构和性能 363
第5章 线程、内存和并发 364
第6章 并发和性能 365
第7章 并发数据结构 365
第8章 C 中的并发 366
第9章 高性能C 367
第10章 C 中的编译器优化 368
第11章 未定义行为和性能 369
第12章 性能设计 369
第1章 性能和并发性简介 3
1.1 程序员要关注性能的原因 3
1.2 有关性能重要性的解释 6
1.3 程序性能 8
1.3.1 吞吐量指标 8
1.3.2 功耗指标 9
1.3.3 实时应用性能 10
1.3.4 上下文环境 11
1.4 评估和预测性能 12
1.5 精通高性能应用程序开发 13
1.6 小结 14
1.7 思考题 15
第2章 性能测量 17
2.1 技术要求 17
2.2 性能测量示例 18
2.3 性能基准测试 25
2.3.1 C 计时器 25
2.3.2 高分辨率计时器 26
2.4 性能分析 31
2.4.1 perf性能分析器 32
2.4.2 使用perf 进行详细性能分析 34
2.4.3 Google Performance性能分析器 37
2.4.4 使用调用图进行性能分析 38
2.4.5 优化和内联 42
2.4.6 实际性能分析 44
2.5 微基准测试 45
2.5.1 微基准测试的基础知识 45
2.5.2 微基准测试和编译器优化 48
2.5.3 Google Benchmark 51
2.5.4 微基准测试是谎言 54
2.6 小结 58
2.7 思考题 59
第3章 CPU架构、资源和性能 61
3.1 技术要求 61
3.2 CPU和性能 62
3.3 使用微基准测试性能 64
3.4 可视化指令级并行性 70
3.5 数据依赖和流水线 72
3.6 流水线和分支 77
3.6.1 分支预测 80
3.6.2 分支预测错误的性能分析 82
3.7 推测执行 85
3.8 复杂条件的优化 86
3.9 无分支计算 90
3.9.1 循环展开 90
3.9.2 无分支选择 91
3.9.3 无分支计算示例 93
3.10 小结 96
3.11 思考题 97
第4章 内存架构和性能 99
4.1 技术要求 99
4.2 影响性能的不止CPU 100
4.3 测量内存访问速度 102
4.3.1 内存架构 103
4.3.2 测量内存和缓存速度 105
4.4 内存的速度:数字 108
4.4.1 随机内存访问速度 108
4.4.2 顺序内存访问速度 111
4.4.3 硬件中的内存性能优化 113
4.5 优化内存性能 115
4.5.1 高效使用内存的数据结构 116
4.5.2 分析内存性能 119
4.5.3 优化内存性能的算法 121
4.6 机器里的“幽灵” 126
4.6.1 关于Spectre 127
4.6.2 Spectre攻击示例 129
4.6.3 释放“幽灵” 133
4.7 小结 137
4.8 思考题 137
第5章 线程、内存和并发 139
5.1 技术要求 139
5.2 理解线程和并发 139
5.2.1 关于线程 140
5.2.2 对称多线程 141
5.2.3 线程和内存 141
5.2.4 内存受限程序和并发 145
5.3 了解内存同步的成本 146
5.4 数据共享成本高昂的原因 151
5.5 了解并发和顺序 157
5.5.1 顺序的需要 157
5.5.2 内存顺序和内存屏障 159
5.5.3 C 中的内存顺序 165
5.6 内存模型 168
5.7 小结 172
5.8 思考题 172
第2篇 并发的高级应用
第6章 并发和性能 175
6.1 技术要求 175
6.2 高效使用并发需要的条件 176
6.3 锁、替代品及其性能 177
6.3.1 基于锁、无锁和无等待的程序 179
6.3.2 针对不同问题的不同锁 181
6.3.3 锁与无锁的真正区别 185
6.4 并发编程的构建块 187
6.4.1 并发数据结构的基础知识 188
6.4.2 计数器和累加器 191
6.4.3 发布协议 196
6.5 并发编程的智能指针 198
6.5.1 发布指针 198
6.5.2 原子共享指针 201
6.6 小结 204
6.7 思考题 204
第7章 并发数据结构 205
7.1 技术要求 205
7.2 关于线程安全数据结构 205
7.2.1 最好的线程安全性 206
7.2.2 真正的线程安全性 208
7.3 线程安全栈 208
7.3.1 线程安全的接口设计 209
7.3.2 互斥锁保护的数据结构的性能 211
7.3.3 不同用途的性能要求 213
7.3.4 有关栈性能的细节讨论 217
7.3.5 同步方案的性能估计 220
7.3.6 无锁栈 223
7.4 线程安全队列 229
7.4.1 无锁队列 230
7.4.2 非顺序一致的数据结构 235
7.4.3 并发数据结构的内存管理 238
7.5 线程安全列表 240
7.5.1 列表的挑战 240
7.5.2 无锁列表 243
7.6 小结 249
7.7 思考题 249
第8章 C 中的并发 251
8.1 技术要求 251
8.2 C 11中的并发支持 251
8.3 C 17中的并发支持 253
8.4 C 20中的并发支持 256
8.4.1 协程的基础知识 257
8.4.2 协程C 语法 261
8.4.3 协程示例 262
8.5 小结 268
8.6 思考题 269
第3篇 设计和编写高性能程序
第9章 高性能C 273
9.1 技术要求 273
9.2 关于编程语言的效率 273
9.3 不必要的复制 275
9.3.1 复制和参数传递 275
9.3.2 将复制作为一种实现技术 277
9.3.3 复制以存储数据 278
9.3.4 复制返回值 279
9.3.5 使用指针避免复制 283
9.3.6 避免不必要的复制 284
9.4 低效的内存管理 285
9.4.1 不必要的内存分配 285
9.4.2 并发程序中的内存管理 289
9.4.3 避免内存碎片 290
9.5 条件执行的优化 293
9.6 小结 295
9.7 思考题 296
第10章 C 中的编译器优化 297
10.1 技术要求 297
10.2 编译器优化代码 297
10.2.1 有关编译器优化的基础知识 298
10.2.2 函数内联 300
10.2.3 编译器真正知道的东西 305
10.2.4 将运行时信息转换为编译时信息 311
10.3 小结 314
10.4 思考题 315
第11章 未定义行为和性能 317
11.1 技术要求 317
11.2 关于未定义行为 317
11.3 产生未定义行为的缘由 320
11.4 未定义行为和C 优化 321
11.5 使用未定义行为进行高效设计 330
11.6 小结 333
11.7 思考题 334
第12章 性能设计 335
12.1 技术要求 335
12.2 设计与性能之间的相互作用 335
12.3 着眼于性能的设计 336
12.3.1 最小信息原则 337
12.3.2 最大信息原则 338
12.4 API设计注意事项 344
12.4.1 有关并发的API设计 344
12.4.2 复制和发送数据 349
12.5 优化数据访问的设计 351
12.6 性能权衡 354
12.6.1 接口设计 354
12.6.2 组件设计 355
12.6.3 错误和未定义的行为 356
12.7 做出明智的设计决策 357
12.8 小结 359
12.9 思考题 359
附录 思考题解答 361
第1章 性能和并发性简介 361
第2章 性能测量 361
第3章 CPU架构、资源和性能 362
第4章 内存架构和性能 363
第5章 线程、内存和并发 364
第6章 并发和性能 365
第7章 并发数据结构 365
第8章 C 中的并发 366
第9章 高性能C 367
第10章 C 中的编译器优化 368
第11章 未定义行为和性能 369
第12章 性能设计 369
猜您喜欢