C++性能优化指南PDF电子书下载
- 电子书积分:11 积分如何计算积分?
- 作 者:(美)柯尔特·甘瑟尔罗斯(Kurt Guntheroth)
- 出 版 社:北京:人民邮电出版社
- 出版年份:2018
- ISBN:9787115471390
- 页数:282 页
第1章 优化概述 1
1.1优化是软件开发的一部分 2
1.2优化是高效的 3
1.3优化是没有问题的 3
1.4这儿一纳秒,那儿一纳秒 5
1.5 C++代码优化策略总结 5
1.5.1用好的编译器并用好编译器 6
1.5.2使用更好的算法 7
1.5.3使用更好的库 8
1.5.4减少内存分配和复制 9
1.5.5移除计算 9
1.5.6使用更好的数据结构 9
1.5.7提高并发性 10
1.5.8优化内存管理 10
1.6小结 10
第2章 影响优化的计算机行为 11
2.1 C++所相信的计算机谎言 12
2.2计算机的真相 12
2.2.1内存很慢 13
2.2.2内存访问并非以字节为单位 13
2.2.3某些内存访问会比其他的更慢 14
2.2.4内存字分为大端和小端 14
2.2.5内存容量是有限的 15
2.2.6指令执行缓慢 16
2.2.7计算机难以作决定 16
2.2.8程序执行中的多个流 16
2.2.9调用操作系统的开销是昂贵的 18
2.3 C++也会说谎 18
2.3.1并非所有语句的性能开销都相同 18
2.3.2语句并非按顺序执行 18
2.4小结 19
第3章 测量性能 20
3.1优化思想 21
3.1.1必须测量性能 21
3.1.2优化器是王牌猎人 21
3.1.3 90/10规则 22
3.1.4阿姆达尔定律 23
3.2进行实验 24
3.2.1记实验笔记 26
3.2.2测量基准性能并设定目标 26
3.2.3你只能改善你能够测量的 28
3.3分析程序执行 28
3.4测量长时间运行的代码 30
3.4.1一点关于测量时间的知识 30
3.4.2用计算机测量时间 35
3.4.3克服测量障碍 41
3.4.4创建stopwatch类 44
3.4.5使用测试套件测量热点函数 48
3.5评估代码开销来找出热点代码 48
3.5.1评估独立的C+++语句的开销 49
3.5.2评估循环的开销 49
3.6其他找出热点代码的方法 51
3.7小结 51
第4章 优化字符串的使用:案例研究 53
4.1为什么字符串很麻烦 53
4.1.1字符串是动态分配的 54
4.1.2字符串就是值 54
4.1.3字符串会进行大量复制 55
4.2第一次尝试优化字符串 56
4.2.1使用复合赋值操作避免临时字符串 57
4.2.2通过预留存储空间减少内存的重新分配 57
4.2.3消除对参数字符串的复制 58
4.2.4使用迭代器消除指针解引 59
4.2.5消除对返回的字符串的复制 59
4.2.6用字符数组代替字符串 60
4.2.7第一次优化总结 62
4.3第二次尝试优化字符串 62
4.3.1使用更好的算法 62
4.3.2使用更好的编译器 64
4.3.3使用更好的字符串库 64
4.3.4使用更好的内存分配器 67
4.4消除字符串转换 69
4.4.1将C字符串转换为std::string 69
4.4.2不同字符集间的转换 70
4.5小结 70
第5章 优化算法 71
5.1算法的时间开销 72
5.1.1最优情况、平均情况和最差情况的时间开销 74
5.1.2摊销时间开销 74
5.1.3其他开销 75
5.2优化查找和排序的工具箱 75
5.3高效查找算法 75
5.3.1查找算法的时间开销 75
5.3.2当n很小时,所有算法的时间开销都一样 76
5.4高效排序算法 77
5.4.1排序算法的时间开销 77
5.4.2替换在最差情况下性能较差的排序算法 77
5.4.3利用输入数据集的已知特性 78
5.5优化模式 78
5.5.1预计算 79
5.5.2延迟计算 80
5.5.3批量处理 80
5.5.4缓存 80
5.5.5特化 81
5.5.6提高处理量 81
5.5.7提示 81
5.5.8优化期待路径 82
5.5.9散列法 82
5.5.10双重检查 82
5.6小结 82
第6章 优化动态分配内存的变量 83
6.1 C++变量回顾 84
6 1.1变量的存储期 84
6.1.2变量的所有权 86
6.1.3值对象与实体对象 86
6.2 C++动态变量API回顾 88
6.2.1使用智能指针实现动态变量所有权的自动化 90
6.2.2动态变量有运行时开销 92
6.3减少动态变量的使用 92
6.3.1静态地创建类实例 92
6.3.2使用静态数据结构 93
6.3.3使用std::make_ shared替代new表达式 97
6.3.4不要无谓地共享所有权 97
6.3.5使用“主指针”拥有动态变量 98
6.4减少动态变量的重新分配 99
6.4.1预分配动态变量以防止重新分配 99
6.4.2在循环外创建动态变量 99
6.5移除无谓的复制 100
6.5.1在类定义中禁止不希望发生的复制 101
6.5.2移除函数调用上的复制 102
6.5.3移除函数返回上的复制 103
6.5.4免复制库 105
6.5.5实现写时复制惯用法 106
6.5.6切割数据结构 106
6.6实现移动语义 107
6.6.1非标准复制语义:痛苦的实现 107
6.6.2 std::swap():“穷人”的移动语义 108
6.6.3共享所有权的实体 109
6.6.4移动语义的移动部分 109
6.6.5更新代码以使用移动语义 110
6.6.6移动语义的微妙之处 111
6.7扁平数据结构 113
6.8小结 113
第7章 优化热点语句 115
7.1从循环中移除代码 116
7.1.1缓存循环结束条件值 117
7.1.2使用更高效的循环语句 117
7.1.3用递减替代递增 118
7.1.4从循环中移除不变性代码 118
7.1.5从循环中移除无谓的函数调用 119
7.1.6从循环中移除隐含的函数调用 121
7.1.7从循环中移除昂贵的、缓慢改变的调用 123
7.1.8将循环放入函数以减少调用开销 123
7.1.9不要频繁地进行操作 124
7.1.10其他优化技巧 126
7.2从函数中移除代码 126
7.2.1函数调用的开销 126
7.2.2简短地声明内联函数 129
7.2.3在使用之前定义函数 129
7.2.4移除未使用的多态性 130
7.2.5放弃不使用的接口 130
7.2.6用模板在编译时选择实现 133
7.2.7避免使用PIMPL惯用法 134
7.2.8移除对DDL的调用 135
7.2.9使用静态成员函数取代成员函数 136
7.2.10将虚析构函数移至基类中 136
7.3优化表达式 137
7.3.1简化表达式 137
7.3.2将常量组合在一起 138
7.3.3使用更高效的运算符 139
7.3.4使用整数计算替代浮点型计算 139
7.3.5双精度类型可能会比浮点型更快 140
7.3.6用闭形式替代迭代计算 141
7.4优化控制流程惯用法 142
7.4.1用switch替代if-else if-else 142
7.4.2用虚函数替代switch或if 143
7.4.3使用无开销的异常处理 144
7.5小结 145
第8章 使用更好的库 146
8.1优化标准库的使用 146
8.1.1 C+++标准库的哲学 147
8.1.2使用C+++标准库的注意事项 147
8.2优化现有库 149
8.2.1改动越少越好 149
8.2.2添加函数,不要改动功能 150
8.3设计优化库 150
8.3.1草率编码后悔多 150
8.3.2在库的设计上,简约是一种美德 151
8.3.3不要在库内分配内存 152
8.3.4若有疑问,以速度为准 152
8.3.5函数比框架更容易优化 152
8.3.6扁平继承层次关系 153
8.3.7扁平调用链 153
8.3.8扁平分层设计 153
8.3.9避免动态查找 154
8.3.10留意“上帝函数” 155
8.4小结 156
第9章 优化查找和排序 157
9.1使用std: :map和std::string的键值对表 158
9.2改善查找性能的工具箱 159
9.2.1进行一次基准测量 160
9.2.2识别出待优化的活动 160
9.2.3分解待优化的活动 160
9.2.4修改或替换算法和数据结构 161
9.2.5在自定义抽象上应用优化过程 162
9.3优化std: :map的查找 163
9.3.1以固定长度的字符数组作为std: :map的键 163
9.3.2以C风格的字符串组作为键使用std: :map 164
9.3.3当键就是值的时候,使用map的表亲std::set 166
9.4使用〈algorithm〉头文件优化算法 167
9.4.1以序列容器作为被查找的键值对表 168
9.4.2 std::find():功能如其名,O(n)时间开销 169
9.4.3 std::binary_search():不返回值 169
9.4.4使用std::equal_range()的二分查找 170
9.4.5使用std::lower_ bound()的二分查找 170
9.4.6自己编写二分查找法 171
9.4.7使用strcmp()自己编写二分查找法 172
9.5优化键值对散列表中的查找 173
9.5.1使用std::unordered_ map进行散列 173
9.5.2对固定长度字符数组的键进行散列 174
9.5.3以空字符结尾的字符串为键进行散列 175
9.5.4用自定义的散列表进行散列 176
9.6斯特潘诺夫的抽象惩罚 177
9.7使用C++标准库优化排序 178
9.8小结 179
第10章 优化数据结构 181
10.1理解标准库容器 181
10.1.1序列容器 182
10.1.2关联容器 182
10.1.3测试标准库容器 183
10.2 std::vector与std::string 187
10.2.1重新分配的性能影响 188
10.2.2 std: :vector中的插入与删除 188
10.2.3遍历std::vector 190
10.2.4对std::vector排序 191
10.2.5查找std::vector 191
10.3 std::deque 191
10.3.1 std::deque中的插入和删除 193
10.3.2遍历std: :deque 194
10.3.3对std::deque的排序 194
10.3.4查找std: :deque 194
10.4 std::list 194
10.4.1 std: :list中的插入和删除 196
10.4.2遍历std: :list中 197
10.4.3对std :list排序 197
10.4.4查找std::list 197
10.5 std::forward list 198
10.5.1 std::forward_ list中的插入和删除 199
10.5.2遍历std::forward_ list 199
10.5.3对std::forward_ list排序 199
10.5.4查找std::forward- list 199
10.6 std::map与std: : multimap 199
10.6.1 std: :map中的插入和删除 200
10.6.2遍历std: :map 202
10.6.3对std: :map排序 202
10.6.4查找std: :map 203
10.7 std::set与 std::multiset 203
10.8 std::unordered_map与std::unordered_multimap 204
10.8.1 std::unordered_ map中的插入与删除 206
10.8.2遍历std::unordered- map 207
10.8.3查找std::unordered_ map 207
10.9其他数据结构 208
10.10小结 209
第11章 优化I/O 210
11.1读取文件的秘诀 210
11.1.1创建一个吝啬的函数签名 211
11.1.2缩短调用链 213
11.1.3减少重新分配 213
11.1.4更大的吞吐量——使用更大的输入缓冲区 215
11.1.5更大的吞吐量——一次读取一行 216
11.1.6再次缩短函数调用链 217
11.1.7无用的技巧 218
11.2写文件 219
11.3从std: :cin读取和向std::cout中写入 220
11.4小结 220
第12章 优化并发 221
12.1复习并发 222
12.1.1并发概述 222
12.1.2交叉执行 226
12.1.3顺序一致性 226
12.1.4竞争 227
12.1.5同步 228
12.1.6原子性 228
12.2复习C++并发方式 230
12.2.1线程 230
12.2.2 promise和future 231
12.2.3异步任务 233
12.2.4互斥量 234
12.2.5锁 235
12.2.6条件变量 236
12.2.7共享变量上的原子操作 238
12.2.8展望未来的C+++并发特性 240
12.3优化多线程C++程序 241
12.3.1用std::async替代std::thread 242
12.3.2创建与核心数量一样多的可执行线程 243
12.3.3实现任务队列和线程池 244
12.3.4在单独的线程中执行I/O 245
12.3.5没有同步的程序 245
12.3.6移除启动和停止代码 247
12.4让同步更加高效 248
12.4.1减小临界区的范围 248
12.4.2限制并发线程的数量 249
12.4.3避免惊群 250
12.4.4避免锁护送 250
12.4.5减少竞争 250
12.4.6不要在单核系统上繁忙等待 251
12.4.7不要永远等待 252
12.4.8自己设计互斥量可能会低效 252
12.4.9限制生产者输出队列的长度 252
12.5并发库 253
12.6小结 254
第13章 优化内存管理 255
13.1复习C++内存管理器API 255
13.11动态变量的生命周期 256
13.1.2内存管理函数分配和释放内存 256
13.1.3 new表达式构造动态变量 259
13.1.4 delete表达式处置动态变量 261
13.1.5显式析构函数调用销毁动态变量 262
13.2高性能内存管理器 263
13.3提供类专用内存管理器 264
13.3.1分配固定大小内存的内存管理器 265
13.3.2内存块分配区 267
13.3.3添加一个类专用new()运算符 269
13.3.4分配固定大小内存块的内存管理器的性能 270
13.3.5分配固定大小内存块的内存管理器的变化形式 270
13.3.6非线程安全的内存管理器是高效的 271
13.4自定义标准库分配器 271
13.4.1最小C+++11分配器 273
13.4.2 C+++98分配器的其他定义 274
13.4.3一个分配固定大小内存块的分配器 278
13.4.4字符串的分配固定大小内存块的分配器 279
13.5小结 281
作者介绍 282
封面介绍 282
- 《近代旅游指南汇刊二编 16》王强主编 2017
- 《联吡啶基钌光敏染料的结构与性能的理论研究》李明霞 2019
- 《甘肃省档案馆指南》甘肃省档案馆编 2018
- 《近代旅游指南汇刊 31》王强主编 2014
- 《近代旅游指南汇刊二编 10》王强主编 2017
- 《手工咖啡 咖啡爱好者的完美冲煮指南》(美国)杰茜卡·伊斯托,安德烈亚斯·威尔霍夫 2019
- 《近代旅游指南汇刊 13》王强主编 2014
- 《近代旅游指南汇刊 28》王强主编 2014
- 《近代旅游指南汇刊 23》王强主编 2014
- 《重庆市绿色建筑评价技术指南》重庆大学,重庆市建筑节能协会绿色建筑专业委员会主编 2018
- 《SQL与关系数据库理论》(美)戴特(C.J.Date) 2019
- 《魔法销售台词》(美)埃尔默·惠勒著 2019
- 《看漫画学钢琴 技巧 3》高宁译;(日)川崎美雪 2019
- 《优势谈判 15周年经典版》(美)罗杰·道森 2018
- 《可汗解梦》俄罗斯领航Pilot动画公司 2017
- 《社会学与人类生活 社会问题解析 第11版》(美)James M. Henslin(詹姆斯·M. 汉斯林) 2019
- 《海明威书信集:1917-1961 下》(美)海明威(Ernest Hemingway)著;潘小松译 2019
- 《迁徙 默温自选诗集 上》(美)W.S.默温著;伽禾译 2020
- 《一个数学家的辩白》(英)哈代(G.H.Hardy)著;李文林,戴宗铎,高嵘译 2019
- 《上帝的孤独者 下 托马斯·沃尔夫短篇小说集》(美)托马斯·沃尔夫著;刘积源译 2017
- 《指向核心素养 北京十一学校名师教学设计 英语 七年级 上 配人教版》周志英总主编 2019
- 《办好人民满意的教育 全国教育满意度调查报告》(中国)中国教育科学研究院 2019
- 《北京生态环境保护》《北京环境保护丛书》编委会编著 2018
- 《人民院士》吴娜著 2019
- 《指向核心素养 北京十一学校名师教学设计 英语 九年级 上 配人教版》周志英总主编 2019
- 《中国人民的心》杨朔著;夕琳编 2019
- 《高等院校旅游专业系列教材 旅游企业岗位培训系列教材 新编北京导游英语》杨昆,鄢莉,谭明华 2019
- 《中华人民共和国成立70周年优秀文学作品精选 短篇小说卷 上 全2册》贺邵俊主编 2019
- 《指向核心素养 北京十一学校名师教学设计 数学 九年级 上 配人教版》周志英总主编 2019
- 《中华人民共和国成立70周年优秀文学作品精选 中篇小说卷 下 全3册》洪治纲主编 2019