书籍详情
提高C++性能的编程技术
作者:(美)Dov Bulka,(美)David Mayhew著;常晓波,朱剑平译;常晓波译
出版社:清华大学出版社
出版时间:2003-06-01
ISBN:9787302065500
定价:¥33.00
购买这本书可以去
内容简介
很多程序员和软件设计师都认为追求高效的C++是一种很愚蠢的做法。他们认为C++天生就慢,对性能要求很高的应用程序不适合。因此,有一些领域是C++几乎无法成功进入的,如网络、操作系统内核、设备驱动程序等。本书反驳了这种观点。在使商业应用程序获取最大性能方面,本书的两位作者拥有第一手资料。本书说明了使用C++开发高效程序的潜力,提示了实践中一些平常的面向对象的设计原则以及获得大幅度性能提高的C++编程技术。本书还指出了在设计和编码中产生隐含操作代价的一些常见错误。本书关注强大和灵活性与良好性能和可伸缩性的结合,从而使两方面均达到最佳。具体主题包括临时对象、内存管理、模板、继承、虚承数、内联、引用计数、STL等。通过本书,您将能够精通最佳性能技术的主要内容。
作者简介
Dov Bulka在软件开发以及向市场交付大型软件产品方面有15年的经验。他曾是IBM DominoGo Web服务器的性能设计师,一些曾出现在Internet上的最大型Web站点使用了这种服务器,包括1996年亚特兰大奥运会的Web站点。他获得了杜克大学的计算机科学博士学位。
目录
序
引言
第1章 跟踪范例
1.1 初步的跟踪实现
1.1.1 发生了什么问题
1.1.2 恢复计划
1.2 要点
第2章 构造函数和析构函数
2.1 继承
2.2 合成
2.3 缓式构造
2.4 冗余构造
2.5 要点
第3章 虚函数
3.1 虚函数的构造
3.2 模板和继承
3.2.1 硬编码
3.2.2 继承
3.2.3 模板
3.3 要点
第4章 返回值优化
4.1 按值返回的构造
4.2 返回值优化
4.3 计算性构造函数
4.4 要点
第5章 临时对象
5.1 对象定义
5.2 类型不匹配
5.3 按值传递
5.4 按值返回
5.5 使用op=()消除临时对象
5.6 要点
第6章 单线程内存池
6.1 版本0:全局函数new()和delete()
6.2 版本1:专用Rational内存管理器
6.3 版本2:固定大小对象的内存池
6.4 版本3:单线程可变大小内存管理器
6.5 要点
第7章 多线程内存池
7.1 版本4:实现
7.2 版本5:快速锁定
7.3 要点
第8章 内联基础
8.1 什么是内联
8.2 方法调用代价
8.3 为何使用内联
8.4 内联详述
8.5 内联虚方法
8.6 通过内联获得性能
8.7 要点
第9章 内联——性能方面的考虑
9.1 调用间优化
9.2 为何不使用内联
9.3 开发阶段和编译时的内联考虑
9.4 基于配置的内联
9.5 内联规则
9.5.1 惟一
9.5.2 微小
9.6 要点
第10章 内联技巧
10.1 条件内联
10.2 选择性内联
10.3 递归内联
10.4 对静态局部变量进行内联
10.5 与体系结构有关的注意事项:多寄存器集
10.6 要点
第11章 标准模板库
11.1 渐近复杂度
11.2 插入
11.3 删除
11.4 遍历
11.5 查找
11.6 函数对象
11.7 比STL更好
11.8 要点
第12章 引用计数
12.1 实现细节
12.2 已存在类
12.3 并发引用计数
12.4 要点
第13章 代码优化
13.1 缓存
13.2 预先计算
13.3 降低灵活性
13.4 80-20规则:提高常用路径的速度
13.5 缓式计算
13.6 无用计算
13.7 系统体系结构
13.8 内存管理
13.9 库和系统调用
13.10 编译器优化
13.11 要点
第14章 设计优化
14.1 设计灵活性
14.2 缓存
14.2.1 Web服务器时间戳
14.2.2 数据扩展
14.2.3 公用代码陷阱
14.3 高效的数据结构
14.4 缓式计算
14.5 无用计算
14.6 失效代码
14.7 要点
第15章 可伸缩性
15.1 SMP体系结构
15.2 Amdahl法则
15.3 多线程和同步术语
15.4 把一个任务分解成多个子任务
15.5 缓存共享数据
15.6 无共享
15.7 部分共享
15.8 锁的粒度
15.9 伪共享
15.10 Thundering Herd
15.11 读/写锁
15.12 要点
第16章 系统体系结构相关性
16.1 内存层次
16.2 寄存器:内存之王
16.3 磁盘和内存结构
16.4 缓存影响
16.5 缓存颠簸
16.6 避免跳转
16.7 简单计算胜过小分支
16.8 线程影响
16.9 上下文切换
16.10 内核交叉
16.11 线程选择
16.12 要点
参考文献
引言
第1章 跟踪范例
1.1 初步的跟踪实现
1.1.1 发生了什么问题
1.1.2 恢复计划
1.2 要点
第2章 构造函数和析构函数
2.1 继承
2.2 合成
2.3 缓式构造
2.4 冗余构造
2.5 要点
第3章 虚函数
3.1 虚函数的构造
3.2 模板和继承
3.2.1 硬编码
3.2.2 继承
3.2.3 模板
3.3 要点
第4章 返回值优化
4.1 按值返回的构造
4.2 返回值优化
4.3 计算性构造函数
4.4 要点
第5章 临时对象
5.1 对象定义
5.2 类型不匹配
5.3 按值传递
5.4 按值返回
5.5 使用op=()消除临时对象
5.6 要点
第6章 单线程内存池
6.1 版本0:全局函数new()和delete()
6.2 版本1:专用Rational内存管理器
6.3 版本2:固定大小对象的内存池
6.4 版本3:单线程可变大小内存管理器
6.5 要点
第7章 多线程内存池
7.1 版本4:实现
7.2 版本5:快速锁定
7.3 要点
第8章 内联基础
8.1 什么是内联
8.2 方法调用代价
8.3 为何使用内联
8.4 内联详述
8.5 内联虚方法
8.6 通过内联获得性能
8.7 要点
第9章 内联——性能方面的考虑
9.1 调用间优化
9.2 为何不使用内联
9.3 开发阶段和编译时的内联考虑
9.4 基于配置的内联
9.5 内联规则
9.5.1 惟一
9.5.2 微小
9.6 要点
第10章 内联技巧
10.1 条件内联
10.2 选择性内联
10.3 递归内联
10.4 对静态局部变量进行内联
10.5 与体系结构有关的注意事项:多寄存器集
10.6 要点
第11章 标准模板库
11.1 渐近复杂度
11.2 插入
11.3 删除
11.4 遍历
11.5 查找
11.6 函数对象
11.7 比STL更好
11.8 要点
第12章 引用计数
12.1 实现细节
12.2 已存在类
12.3 并发引用计数
12.4 要点
第13章 代码优化
13.1 缓存
13.2 预先计算
13.3 降低灵活性
13.4 80-20规则:提高常用路径的速度
13.5 缓式计算
13.6 无用计算
13.7 系统体系结构
13.8 内存管理
13.9 库和系统调用
13.10 编译器优化
13.11 要点
第14章 设计优化
14.1 设计灵活性
14.2 缓存
14.2.1 Web服务器时间戳
14.2.2 数据扩展
14.2.3 公用代码陷阱
14.3 高效的数据结构
14.4 缓式计算
14.5 无用计算
14.6 失效代码
14.7 要点
第15章 可伸缩性
15.1 SMP体系结构
15.2 Amdahl法则
15.3 多线程和同步术语
15.4 把一个任务分解成多个子任务
15.5 缓存共享数据
15.6 无共享
15.7 部分共享
15.8 锁的粒度
15.9 伪共享
15.10 Thundering Herd
15.11 读/写锁
15.12 要点
第16章 系统体系结构相关性
16.1 内存层次
16.2 寄存器:内存之王
16.3 磁盘和内存结构
16.4 缓存影响
16.5 缓存颠簸
16.6 避免跳转
16.7 简单计算胜过小分支
16.8 线程影响
16.9 上下文切换
16.10 内核交叉
16.11 线程选择
16.12 要点
参考文献
猜您喜欢