• 读书笔记——C++高性能编程(一至三)


    《C++高性能编程》作者:费多尔.G.皮克斯 版本:2022年11月第1版

    第一章.性能基础

    描述了吞吐量,功耗,实时应用性能的含义。

    阐述了“虽然几乎不可能提前预测最佳优化,但是可以确定某些设计决策将使后续优化变得非常困难甚至不可行”这样一个观点。这个观点就是说要在设计决策的时候将优化考虑在内。 

    第二章.性能测试

    “性能的第一条规则是'永远不要猜测性能'”。介绍了两个性能分析器:perf,gperftools(https://github.com/gperftools/gperftools);以及一个微基准测试工具:google-benchmark(https://github.com/google/benchmark)。

    以下是使用gperftools进行微基准测试的一个样例。其中编译example可执行程序的时候要增加链接库-lprofiler才能使用pprof,编译完成后要使用CPUPROFILER环境变量制定生成的文件名。下面是一个例子:

    d3800677511d413c8d20657b3c890dce.png

    可以看到统计出的结果就是所有的时间都用在了compare2这个函数上面了。

    以下是使用perf命令的样例:

    b8c9a92b4ec44a728e6567c841ed92b4.png

    打印中提及了缓存命中,缓存未命中,分支命中以及分支未命中的情况。

    以下是使用google-benchmark的情况:

    fcc8f347e7fc4dbc9e88fc1de97e0c12.png

    从这章中我们了解到,不同的整形的计算速度也是不一样的。unsigned int的计算速度要比int类型要慢。

    缓存命中率和分支预判对性能的影响也比较大。因为缓存如果没命中则需要从主存中读取数据,而读取数据的时间是非常长的。

    第三章.CPU架构,资源和性能

    该章节讨论了指令级并行(ILP),数据依赖和流水线。然后介绍了怎么进行分支优化,分支优化即——无分支化。

    如果分支的条件随即性比较强,则程序的运行效果会比较差,因为会存在“流水线冲刷”这样的操作,因为流水线会在依赖条件计算出来之前预先进行计算 ,但是如果计算结果和分支不匹配,就会发生流水线冲刷的事件。

    无分支化使用的方法就是以值计算和索引替代分支判断。但是无分支化也并非一定比分支判断要快,因为无分支化需要执行更多的指令。个人理解:无分支化在判断条件后执行的语句较长就可以进行无分支化,因为较长的流水线完全可以中和分支索引计算的开销。

     

  • 相关阅读:
    从零基础转行渗透测试到如今20k,我经历了什么?
    3┃音视频直播系统之浏览器中通过 WebRTC 直播视频实时录制回放下载
    k8s探针详解
    Jwt的基础入门,详细讲解
    智工教育:教编考试加分事项及报考条件
    每日一文(第二天)
    Python入门|零基础教程
    [C++] 元组(tuple)
    电影【忠犬帕尔玛】
    C# 高级 <一>
  • 原文地址:https://blog.csdn.net/Dr_Jack/article/details/133674348