【英杰送书第十一期】C++高性能编程

【好书推荐】

        

清华社【秋日阅读企划】领券立享优惠

IT好书 5折叠加10元 无门槛优惠券:京东网上商城

活动时间:9月4日-9月17日,先到先得,快快来抢

 内容简介

        《C++高性能编程》详细阐述了与C++高性能编程相关的基本解决方案,主要包括性能和并发性简介,性能测量, CPU架构、资源和性能,内存架构和性能,线程、内存和并发,并发和性能,并发数据结构,C++中的并发,高性能C++,C++中的编译器优化,未定义行为和性能,性能设计等内容。此外,本书还提供了相应的示例、代码,以帮助读者进一步理解相关方案的实现过程。

        本书适合作为高等院校计算机及相关专业的教材和教学参考书,也可作为相关开发人员的自学用书和参考手册。

  购买链接: https://item.jd.com/13602899.html

 目录

第1篇 性 能 基 础

第1章 性能和并发性简介 3

1.1 程序员要关注性能的原因 3

1.2 有关性能重要性的解释 6

1.3 程序性能 8

1.3.1 吞吐量指标 8

1.3.2 功耗指标 9

1.3.3 实时应用性能 10

1.3.4 上下文环境 11

1.4 评估和预测性能 12

1.5 精通高性能应用程序开发 13

1.6 小结 14

1.7 思考题 15

第2章 性能测量 17

2.1 技术要求 17

2.2 性能测量示例 18

2.3 性能基准测试 25

2.3.1 C++计时器 25

2.3.2 高分辨率计时器 26

2.4 性能分析 31

2.4.1 perf性能分析器 32

2.4.2 使用perf 进行详细性能分析 34

2.4.3 Google Performance性能分析器 37

2.4.4 使用调用图进行性能分析 38

2.4.5 优化和内联 42

2.4.6 实际性能分析 44

2.5 微基准测试 45

2.5.1 微基准测试的基础知识 45

2.5.2 微基准测试和编译器优化 48

2.5.3 Google Benchmark 51

2.5.4 微基准测试是谎言 54

2.6 小结 58

2.7 思考题 59

第3章 CPU架构、资源和性能 61

3.1 技术要求 61

3.2 CPU和性能 62

3.3 使用微基准测试性能 64

3.4 可视化指令级并行性 70

3.5 数据依赖和流水线 72

3.6 流水线和分支 77

3.6.1 分支预测 80

3.6.2 分支预测错误的性能分析 82

3.7 推测执行 85

3.8 复杂条件的优化 86

3.9 无分支计算 90

3.9.1 循环展开 90

3.9.2 无分支选择 91

3.9.3 无分支计算示例 93

3.10 小结 96

3.11 思考题 97

第4章 内存架构和性能 99

4.1 技术要求 99

4.2 影响性能的不止CPU 100

4.3 测量内存访问速度 102

4.3.1 内存架构 103

4.3.2 测量内存和缓存速度 105

4.4 内存的速度:数字 108

4.4.1 随机内存访问速度 108

4.4.2 顺序内存访问速度 111

4.4.3 硬件中的内存性能优化 113

4.5 优化内存性能 115

4.5.1 高效使用内存的数据结构 116

4.5.2 分析内存性能 119

4.5.3 优化内存性能的算法 121

4.6 机器里的“幽灵” 126

4.6.1 关于Spectre 127

4.6.2 Spectre攻击示例 129

4.6.3 释放“幽灵” 133

4.7 小结 137

4.8 思考题 137

第5章 线程、内存和并发 139

5.1 技术要求 139

5.2 理解线程和并发 139

5.2.1 关于线程 140

5.2.2 对称多线程 141

5.2.3 线程和内存 141

5.2.4 内存受限程序和并发 145

5.3 了解内存同步的成本 146

5.4 数据共享成本高昂的原因 151

5.5 了解并发和顺序 157

5.5.1 顺序的需要 157

5.5.2 内存顺序和内存屏障 159

5.5.3 C++中的内存顺序 165

5.6 内存模型 168

5.7 小结 172

5.8 思考题 172

第2篇 并发的高级应用

第6章 并发和性能 175

6.1 技术要求 175

6.2 高效使用并发需要的条件 176

6.3 锁、替代品及其性能 177

6.3.1 基于锁、无锁和无等待的程序 179

6.3.2 针对不同问题的不同锁 181

6.3.3 锁与无锁的真正区别 185

6.4 并发编程的构建块 187

6.4.1 并发数据结构的基础知识 188

6.4.2 计数器和累加器 191

6.4.3 发布协议 196

6.5 并发编程的智能指针 198

6.5.1 发布指针 198

6.5.2 原子共享指针 201

6.6 小结 204

6.7 思考题 204

第7章 并发数据结构 205

7.1 技术要求 205

7.2 关于线程安全数据结构 205

7.2.1 最好的线程安全性 206

7.2.2 真正的线程安全性 208

7.3 线程安全栈 208

7.3.1 线程安全的接口设计 209

7.3.2 互斥锁保护的数据结构的性能 211

7.3.3 不同用途的性能要求 213

7.3.4 有关栈性能的细节讨论 217

7.3.5 同步方案的性能估计 220

7.3.6 无锁栈 223

7.4 线程安全队列 229

7.4.1 无锁队列 230

7.4.2 非顺序一致的数据结构 235

7.4.3 并发数据结构的内存管理 238

7.5 线程安全列表 240

7.5.1 列表的挑战 240

7.5.2 无锁列表 243

7.6 小结 249

7.7 思考题 249

第8章 C++中的并发 251

8.1 技术要求 251

8.2 C++11中的并发支持 251

8.3 C++17中的并发支持 253

8.4 C++20中的并发支持 256

8.4.1 协程的基础知识 257

8.4.2 协程C++语法 261

8.4.3 协程示例 262

8.5 小结 268

8.6 思考题 269

第3篇 设计和编写高性能程序

第9章 高性能C++ 273

9.1 技术要求 273

9.2 关于编程语言的效率 273

9.3 不必要的复制 275

9.3.1 复制和参数传递 275

9.3.2 将复制作为一种实现技术 277

9.3.3 复制以存储数据 278

9.3.4 复制返回值 279

9.3.5 使用指针避免复制 283

9.3.6 避免不必要的复制 284

9.4 低效的内存管理 285

9.4.1 不必要的内存分配 285

9.4.2 并发程序中的内存管理 289

9.4.3 避免内存碎片 290

9.5 条件执行的优化 293

9.6 小结 295

9.7 思考题 296

第10章 C++中的编译器优化 297

10.1 技术要求 297

10.2 编译器优化代码 297

10.2.1 有关编译器优化的基础知识 298

10.2.2 函数内联 300

10.2.3 编译器真正知道的东西 305

10.2.4 将运行时信息转换为编译时信息 311

10.3 小结 314

10.4 思考题 315

第11章 未定义行为和性能 317

11.1 技术要求 317

11.2 关于未定义行为 317

11.3 产生未定义行为的缘由 320

11.4 未定义行为和C++优化 321

11.5 使用未定义行为进行高效设计 330

11.6 小结 333

11.7 思考题 334

第12章 性能设计 335

12.1 技术要求 335

12.2 设计与性能之间的相互作用 335

12.3 着眼于性能的设计 336

12.3.1 最小信息原则 337

12.3.2 最大信息原则 338

12.4 API设计注意事项 344

12.4.1 有关并发的API设计 344

12.4.2 复制和发送数据 349

12.5 优化数据访问的设计 351

12.6 性能权衡 354

12.6.1 接口设计 354

12.6.2 组件设计 355

12.6.3 错误和未定义的行为 356

12.7 做出明智的设计决策 357

12.8 小结 359

12.9 思考题 359

附录 思考题解答 361

第1章 性能和并发性简介 361

第2章 性能测量 361

第3章 CPU架构、资源和性能 362

第4章 内存架构和性能 363

第5章 线程、内存和并发 364

第6章 并发和性能 365

第7章 并发数据结构 365

第8章 C++中的并发 366

第9章 高性能C++ 367

第10章 C++中的编译器优化 368

第11章 未定义行为和性能 369

第12章 性能设计 369

前言/序言 

        

        高性能编程艺术再次受到重视。多年以前,程序员必须对每一比特数据的情况都了如指掌(这里说的“一比特”有时就是它字面上的意思,因为一比特的数据就有可能控制前面板上的开关)。现在,计算机有足够的能力来处理日常任务。当然,总有一些领域永远没有足够的计算能力。但是,大多数程序员都可以避免编写低效的代码。这并不是一件坏事,因为程序员可以不受性能限制,专注于以其他方式改进代码。

        本书首先解释为什么越来越多的程序员不得不再次关注性能和效率。这为整本书定下基调,因为它定义了我们将在后续章节中使用的方法:关于性能的知识最终必须来自测量,并且每个与性能相关的意见都必须有数据支持。

        高性能编程有5个组成部分,它们也是共同决定程序性能的5个元素。

        第1个元素是计算硬件,它也是我们需要深入探索的底层基础。本书从单个组件(处理器和内存)到多处理器计算系统进行了比较全面的讨论,详细阐释了内存模型、数据共享的成本,甚至无锁编程等。

        第2个元素是高效使用编程语言。正是基于这一点,本书更加特定于C++(其他语言有不同的低效率特征)。

        第3个元素是编译器。本书讨论了与编译器相关的提高程序性能的技巧。

        第4个元素是设计。也可以说,它其实应该是排在第一位的元素:如果设计没有将性能作为其明确目标之一,那么在后期添加良好的性能几乎是不可能的。当然,本书将性能设计安排在最后,因为这是一个高级概念,它需要以我们之前讨论的所有知识为基础。

        高性能编程的第5个元素就是程序员,程序员的知识和技能将决定最终结果。

        为了帮助读者顺利学习,本书包含许多示例,可用于读者的实战探索和自学。高性能编程是一项艺术,对于艺术的追求永无止境。因此,本书将是读者探寻高性能编程的起 点,而不是终点。

读者须知

        本书适用于从事性能关键项目开发并希望学习不同技术以提高代码性能的经验丰富的开发人员和程序员。计算机建模、算法交易、游戏、生物信息学、基于物理的模拟、计算机辅助设计、计算基因组学或计算流体动力学等领域的程序员都可以从本书中学习到各种技术,并将之应用到自己的工作领域。

        虽然本书使用的是C++ 语言,但书中展示的概念可以很容易地转移或应用到其他编译语言,如C、C#、Java、Rust和Go等。

内容介绍

本书分为3篇,共12章,具体介绍如下。

第1篇“性能基础”,包括第1~5章。

第1章“性能和并发性简介”,详细阐释了我们要关心程序性能的原因,特别是为什么会出现性能低下的现象,讨论了有关程序性能的指标,因为无论执行快慢,了解影响性能的不同因素以及程序特定行为的原因都很重要。

第2章“性能测量”,其内容与测量有关。性能通常是不直观的,所有涉及效率的决策,从设计选择到优化,都应以可靠数据为指导。本章描述了不同类型的性能测量,解释了它们的不同之处以及何时使用它们,并介绍了如何在不同情况下正确测量性能。

第3章“CPU架构、资源和性能”,研究了最重要的硬件资源以及如何有效地使用它们以实现最佳性能。本章着重介绍了CPU资源和功能、使用它们的最佳方法、未充分利用CPU资源的常见原因以及如何解决这些问题。

第4章“内存架构和性能”,阐释了现代内存架构及其固有的弱点,以及对抗或至少隐藏这些弱点的方法。对于许多程序来说,性能完全取决于程序员是否利用了旨在提高内存性能的硬件特性,本章介绍了这样做的必需技能。

第5章“线程、内存和并发”,继续研究了内存系统及其对性能的影响,但本章将研究扩展到多核系统和多线程程序领域。原本就很容易成为性能瓶颈的内存,在加入并发机制时,问题会更大。虽然硬件强加的基本限制无法克服,但大多数程序的性能甚至还没有接近这些限制,因此,熟练的程序员仍有很大的空间来提高代码的效率。本章为读者提供了与此相关的必要知识和工具。

第2篇“并发的高级应用”,包括第6~8章。

        第6章“并发和性能”,介绍了如何为线程安全程序开发高性能并发算法和数据结构。一方面,要充分利用并发性,必须对问题和解决方案策略有一个高层次的看法,例如,数据组织方式、工作划分以及解决方案的选择等都会对程序的性能产生重大影响。另一方面,还要看到,性能受到缓存中数据排列等低级因素的影响很大,即使是最好的设计,也可能被糟糕的实现所破坏。

        第7章“并发数据结构”,解释了并发程序中数据结构的性质,以及当数据结构在多线程上下文中使用时,诸如“栈”和“队列”之类的数据结构还意味着什么。

        第8章“C++中的并发”,描述了在C++ 17和C++ 20标准中添加的并发编程特性。虽然现在谈论使用这些功能以获得最佳性能的最佳实践还为时过早,但我们可以描述它们的作用以及编译器支持的当前状态。

 第3篇“设计和编写高性能程序”,包括第9~12章。

        第9章“高性能C++”,开始将讨论重点从硬件资源的最佳使用转移到特定编程语言的最佳应用。虽然此前我们所学的一切都可以直接应用到任何语言的任何程序中,但本章的重点是讨论C++的特性。读者将了解C++语言的哪些特性可能会导致性能问题以及如何避免这些问题。

        第10章“C++中的编译器优化”,讨论了编译器优化以及程序员如何帮助编译器生成更高效的代码。

        第11章“未定义行为和性能”,本章有两个重点,一方面,解释了程序员在试图从他们的代码中榨取最大性能时经常忽略的未定义行为的危险;另一方面,解释了如何利用未定义行为来提高性能以及如何正确指定和说明此类情况。总的来说,与通常的“任何事情都可能发生”相比,本章提供了一种比较常见但更相关的方式来理解未定义行为的问题。

        第12章“性能设计”,回顾了本书中介绍过的所有与性能相关的因素和特性,并探讨了我们获得的知识和理解如何影响我们在开发新软件系统或重新设计软件架构时做出的决策。

参与活动

1️⃣参与方式:关注、点赞、收藏

        评论:人生苦短,我用C++(每人最多可评论三条)


2️⃣获奖方式:程序随机抽取 3位,每位小伙伴将获得一本书


3️⃣活动时间:截止到 2023-09-17 22:00:00

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yan-英杰

感谢大佬打赏,我会更加努力创作

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值