《C++高性能编程》作者:费多尔.G.皮克斯 版本:2022年11月第1版
第一章.性能基础
描述了吞吐量,功耗,实时应用性能的含义。
阐述了“虽然几乎不可能提前预测最佳优化,但是可以确定某些设计决策将使后续优化变得非常困难甚至不可行”这样一个观点。这个观点就是说要在设计决策的时候将优化考虑在内。
第二章.性能测试
“性能的第一条规则是'永远不要猜测性能'”。介绍了两个性能分析器:perf,gperftools(https://github.com/gperftools/gperftools);以及一个微基准测试工具:google-benchmark(https://github.com/google/benchmark)。
以下是使用gperftools进行微基准测试的一个样例。其中编译example可执行程序的时候要增加链接库-lprofiler才能使用pprof,编译完成后要使用CPUPROFILER环境变量制定生成的文件名。下面是一个例子:
可以看到统计出的结果就是所有的时间都用在了compare2这个函数上面了。
以下是使用perf命令的样例:
打印中提及了缓存命中,缓存未命中,分支命中以及分支未命中的情况。
以下是使用google-benchmark的情况:
从这章中我们了解到,不同的整形的计算速度也是不一样的。unsigned int的计算速度要比int类型要慢。
缓存命中率和分支预判对性能的影响也比较大。因为缓存如果没命中则需要从主存中读取数据,而读取数据的时间是非常长的。
第三章.CPU架构,资源和性能
该章节讨论了指令级并行(ILP),数据依赖和流水线。然后介绍了怎么进行分支优化,分支优化即——无分支化。
如果分支的条件随即性比较强,则程序的运行效果会比较差,因为会存在“流水线冲刷”这样的操作,因为流水线会在依赖条件计算出来之前预先进行计算 ,但是如果计算结果和分支不匹配,就会发生流水线冲刷的事件。
无分支化使用的方法就是以值计算和索引替代分支判断。但是无分支化也并非一定比分支判断要快,因为无分支化需要执行更多的指令。个人理解:无分支化在判断条件后执行的语句较长就可以进行无分支化,因为较长的流水线完全可以中和分支索引计算的开销。