图书介绍

C++性能优化指南PDF|Epub|txt|kindle电子书版本网盘下载

C++性能优化指南
  • (美)柯尔特·甘瑟尔罗斯(Kurt Guntheroth) 著
  • 出版社: 北京:人民邮电出版社
  • ISBN:9787115471390
  • 出版时间:2018
  • 标注页数:282页
  • 文件大小:34MB
  • 文件页数:306页
  • 主题词:C语言-程序设计-指南

PDF下载


点此进入-本书在线PDF格式电子书下载【推荐-云解压-方便快捷】直接下载PDF格式图书。移动端-PC端通用
种子下载[BT下载速度快]温馨提示:(请使用BT下载软件FDM进行下载)软件下载地址页直链下载[便捷但速度慢]  [在线试读本书]   [在线获取解压码]

下载说明

C++性能优化指南PDF格式电子书版下载

下载的文件为RAR压缩包。需要使用解压软件进行解压得到PDF格式图书。

建议使用BT下载工具Free Download Manager进行下载,简称FDM(免费,没有广告,支持多平台)。本站资源全部打包为BT种子。所以需要使用专业的BT下载软件进行下载。如BitComet qBittorrent uTorrent等BT下载工具。迅雷目前由于本站不是热门资源。不推荐使用!后期资源热门了。安装了迅雷也可以迅雷进行下载!

(文件页数 要大于 标注页数,上中下等多册电子书除外)

注意:本站所有压缩包均有解压码: 点击下载压缩包解压工具

图书目录

第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::string69

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-else142

7.4.2用虚函数替代switch或if143

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: :map164

9.3.3当键就是值的时候,使用map的表亲std::set166

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::string187

10.2.1重新分配的性能影响188

10.2.2 std: :vector中的插入与删除188

10.2.3遍历std::vector190

10.2.4对std::vector排序191

10.2.5查找std::vector191

10.3 std::deque191

10.3.1 std::deque中的插入和删除193

10.3.2遍历std: :deque194

10.3.3对std::deque的排序194

10.3.4查找std: :deque194

10.4 std::list194

10.4.1 std: :list中的插入和删除196

10.4.2遍历std: :list中197

10.4.3对std :list排序197

10.4.4查找std::list197

10.5 std::forward list198

10.5.1 std::forward_ list中的插入和删除199

10.5.2遍历std::forward_ list199

10.5.3对std::forward_ list排序199

10.5.4查找std::forward- list199

10.6 std::map与std: : multimap199

10.6.1 std: :map中的插入和删除200

10.6.2遍历std: :map202

10.6.3对std: :map排序202

10.6.4查找std: :map203

10.7 std::set与 std::multiset203

10.8 std::unordered_map与std::unordered_multimap204

10.8.1 std::unordered_ map中的插入与删除206

10.8.2遍历std::unordered- map207

10.8.3查找std::unordered_ map207

10.9其他数据结构208

10.10小结209

第11章 优化I/O210

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和future231

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::thread242

12.3.2创建与核心数量一样多的可执行线程243

12.3.3实现任务队列和线程池244

12.3.4在单独的线程中执行I/O245

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++内存管理器API255

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

热门推荐