C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理
分为前半段和后半段,前半段主要介绍现代 C++ ,后半段主要介绍并行编程与优化。 1.课程安排与开发环境搭建: cmake 与 git 入门 2.现代 C++ 入门:常用 STL 容器, RAII 内存管理 3.现代 C++ 进阶:模板元编程与函数式编程 4.编译器如何自动优化:从汇编角度看 C++ 5.C++11 起的多线程编程:从 mutex 到无锁并行 6.并行编程常用框架: OpenMP 构造函数! 编写我们自己的 vector 类! 看来 vector 也不过如此!让我们自己实现一个 Vector 类试试看 吧 It works! 这个 Vector 类有哪些问题? 三五法则:规则类怪谈 1. 如果一个类定义了解构函数,那么您必须同时定义 或删除拷贝构造函数和拷贝赋值函数,否则出错。 2. 如果一个类定义了拷贝构造函数,那么您必须同时 定义或删除拷贝赋值函数,否则出错,删除可导致 们来点(相对)简单的作为饭后甜点吧! C++98 :令人头疼的内存管理 • 在没有智能指针的 C++ 中,我们只能手 动去 new 和 delete 指针。这非常容易出 错,一旦马虎的程序员忘记释放指针,就 会导致内存泄露等情况,更可能被黑客利 用空悬指针篡改系统内存从而盗取重要数 据等。 RAII 解决内存管理的问题: unique_ptr • 似曾相识的情形……是的,和我们刚刚提0 码力 | 96 页 | 16.28 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 16 现代 CMake 模块化项目管理指南
现代 CMake 模块化项目管理指南 彭于斌( @archibate ) 课件 & 源码: https://github.com/parallel101/course 往期录播: https://space.bilibili.com/263032155 找不到头文 件怎么办呀 CMake Cookbook 小彭老师建议 : ~~-·~·~-·~ -~·-·~·- 第一章:文件 / 1/lib/cmake/Qt5” 设置。 举例, Windows 系统, Qt5 • 例如我把 Qt5 安装到了 D:/Qt5.12.1 。 • 首先找到他里面的 Qt5Config.cmake 文件所在位置(可以用文件管理器的“搜索”功能)。 • 假如你找到该文件的位置是 D:/Qt5.12.1/msvc2017/lib/cmake/Qt5/Qt5Config.cmake ,那 么请你设置变量 Qt5_DIR 为 阶段,可以从命令行设置(注意要加引号): • cmake -B build -DQt5_DIR=”D:/Qt5.12.1/msvc2017/lib/cmake/Qt5” • (2) 全局启用。右键“我的电脑” ->“ 管理” ->“ 高级”添加一个环境变量 Qt5_DIR 值为 D:/Qt5.12.1/msvc2017/lib/cmake/Qt5 ,然后重启 Visual Studio 。这样以后你每次构建任 何项目,0 码力 | 56 页 | 6.87 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南
-D 选项:指定配置变量(又称缓存变量) • 可见 CMake 项目的构建分为两步: • 第一步是 cmake -B build ,称为配置阶段( configure ),这时只检测环境并生成构建规则 • 会在 build 目录下生成本地构建系统能识别的项目文件( Makefile 或是 .sln ) • 第二步是 cmake --build build ,称为构建阶段( build ),这时才实际调用编译器来编译代码 Linux 的 make , Windows 的 MSBuild ),从而让构建规则可以只写一份,跨平 台使用。 • 过去的软件(例如 TBB )要跨平台,只好 Makefile 的构建规则写一份, MSBuild 也写一份 。 • 现在只需要写一次 CMakeLists.txt ,他会视不同的操作系统,生成不同构建系统的规则文件。 • 那个和操作系统绑定的构建系统( make 、 MSBuild MSBuild )称为本地构建系统( native buildsystem )。 • 负责从 CMakeLists.txt 生成本地构建系统构建规则文件的,称为生成器( generator )。 -G 选项:指定要用的生成器 • Linux 系统上的 CMake 默认用是 Unix Makefiles 生成器; Windows 系统默认是 Visual Studio 2019 生成器; MacOS0 码力 | 166 页 | 6.54 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 01 学 C++ 从 CMake 学起
分为前半段和后半段,前半段主要介绍现代 C++ ,后半段主要介绍并行编程与优化。 1.课程安排与开发环境搭建: cmake 与 git 入门 2.现代 C++ 入门:常用 STL 容器, RAII 内存管理 3.现代 C++ 进阶:模板元编程与函数式编程 4.编译器如何自动优化:从汇编角度看 C++ 5.C++11 起的多线程编程:从 mutex 到无锁并行 6.并行编程常用框架: OpenMP 为什么需要构建系统( Makefile ) • 文件越来越多时,一个个调用 g++ 编译链接会变得很麻烦。 • 于是,发明了 make 这个程序,你只需写出不同文件之间的依赖关系,和生成各文件的规则。 • > make a.out • 敲下这个命令,就可以构建出 a.out 这个可执行文件了。 • 和直接用一个脚本写出完整的构建过程相比, make 指明依赖关系的好处: 1. 当更新了 hello.o ,而不需要把 main.o 也重新编译一遍。 2. 能够自动并行地发起对 hello.cpp 和 main.cpp 的编译,加快编译速度( make -j )。 3. 用通配符批量生成构建规则,避免针对每个 .cpp 和 .o 重复写 g++ 命令( %.o: %.cpp )。 • 但坏处也很明显: 1. make 在 Unix 类系统上是通用的,但在 Windows 则不然。 20 码力 | 32 页 | 11.40 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 12 从计算机组成原理看 C 语言指针
unsigned long 类型 • 32ULL 是 unsigned long long 类型 • 小写也是可以的: • 32ull 也是 unsigned long long 类型 字面常量的特殊规则:如果 int 表示不下,则自动选择较大的类型 标准化的类型: stdint.h • 而实际上,尽管主流操作系统上 int 都是 32 位的, C 语言标准并没有规定 int 就是 32 位 的。 short ,根据补码的规则仍是 - 128 。 实验:不同大小之间的整数互转 • 例如 char 类型的 127 是 011111111 • 强制转换为 short 后是 00000000 011111111 • 可见符号位还是被完全填充到了 short 的前一个字节 ,这次因为符号位是 0 ,所以 short 的高位也全部 填满了 0 ,对值没有影响,根据补码的规则仍是 127 。 • 例如 char 类型的 -128 是 10000000 • 强制转换为 short 后是 00000000 10000000 • 可见 short 的前一个字节被填满了 0 ,根据补码的 规则他是一个正数 128 。 实验:自动类型提升( type promotion ) • 一个较小类型的 short 和较大类型的 int 相加会得到什么类型?会得到 int 类型。 • 结论:小类型和大类型做数学运算(0 码力 | 128 页 | 2.95 MB | 1 年前3Zadig 面向开发者的云原生 DevOps 平台
部署预发环境 xN 部署生产环境 xN 部署 / 灰度上线 xN 监控 / 告警 xN 版本归档 xN 交付追踪 xN 数据度量 xN 服务、工单管理 事件、缺陷管理 想 法 用 户 运行阶段 需求阶段 研发阶段 现代软件交付挑战:开发 5 分钟,上线 2 小时 服务一:设计 | 代码编写 | 构建 | 服务全生命周期而非只关注代码 ● 每天多次提交提早验证 Zadig 采用「云原生产品级交付」设计理念 数字化产研协同 • 环境 - 统一开发者协作平面 • 工作流 - 统一交付变更通道 • 异构支持 - 统一产研运管理平面 重视开发者体验,工程师不再做脏活累活 传统 DevOps 体系 Zadig 云原生 DevOps 平台 高人效 低人效 低人效 / 低质量 / 低效率 / 高成 本: 人淹没在系统的海洋里,无数平台手工切换 研发透明化:不同项目清晰可见的效率、质量、进度 进度管理:根据团队客观数据,预测和确定项目规划 迭代进度一目了然 项目从无到有可核算 管理有数据科学依据 解放管理,更多时间花在 业务创新 平台运维 业务压力大,能力建设缓慢: • 大量工作花在工具链维护 • 项目间依赖复杂,环境管理难 • 交付版本依赖工单,发布风险高 • 公共资源 / 业务资源利用率低 赋能多业务:一个平台解决了多异构项目的管理和规范 团队高效协作0 码力 | 59 页 | 81.43 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 17 由浅入深学习 map 容器
lambda 表达式知多少 6. 通过实战案例来学习 STL 算法库 7. C++ 标准输入输出流 & 字符串格式化 8. traits 技术,用户自定义迭代器与算法 9. allocator ,内存管理与对象生命周期 10. C++ 异常处理机制的前世今生 我们都要认真鞋习哦 我们都要认真鞋习哦 第一章:读取与写入 我负责监督你鞋习 ! 我负责监督你鞋习 ! map 查找元素的两个接口 • 中的 K-V 对执行了一遍循环体。 迭代器 operator++ 的移动方向 • 迭代器的 ++ 是中根遍历,先左子节点,然后根节点,最后右子节点。 • 为什么是中根遍历?因为刚刚说了二叉排序树的规则是:左子节点<父节点<右子节点。 • 这刚好是中根遍历的顺序,左中右。所以迭代器的 ++ 方向刚好是 K 越来越大的方向。 • 结论:遍历时,总是会按 K 从小到大的顺序。 k k k k 查找为什么高效 • 这就是二叉排序树的构建规则。 • 对于所有节点,都要满足:他左子节点的值 < 该节点的值 < 他右子节点值 • 这到底有什么好处?是不是 C++ 之父觉得排序很好玩所以才排的? 1 4 5 8 7 排序增好玩 排序增好玩 小 大 2 set 查找为什么高效 • 可以证明,只要保证这个树是排序的,那么快速查找到任意一个数的通用规则是: • 设要找的数为 X ,则 set0 码力 | 90 页 | 8.76 MB | 1 年前3谈谈MYSQL那点事
系统优化:硬件、架构 服务优化 服务优化 应用优化 应用优化 MySQL MySQL 优化方式 优化方式 影响性能的因素 影响性能的因素 应用程序 应用程序 查询 查询 事务管理 事务管理 数据库设计 数据库设计 数据分布 数据分布 网络 网络 操作系统 操作系统 硬件 硬件 使用好的硬件,更快的硬盘、大内存、多核 使用好的硬件,更快的硬盘、大内存、多核 录,谁快谁慢太明显了。涉及几个表做 join 时, 效果 就更明显了。更小的字段类型占用的内存就更少,占用 的磁盘空间和磁盘 I/O 也会更少,而且还会占用更少的 带宽。因此 . 在日常选择字段时必须要遵守这一规则。 应用优化 应用优化 索引建立原则(一) 索引建立原则(一) 一般针对数据分散的关键字进行建立索引,比如 一般针对数据分散的关键字进行建立索引,比如 像性别、状态值等等建立索引没有意义0 码力 | 38 页 | 2.04 MB | 1 年前3基于 Rust Arrow Flight 的物联网和时序数据传输及转换工具 霍琳贺
支持标准 SQL 写入,支持批量写入 支持 Schemaless 写入 支持从 Kafaka, MQTT, OPC, PI System 以及文 件直接导入 数据源导入时,可定义规则引擎 TDengine: 与上下游应用的关系 TDengine = Time-Series Database + Caching + Data Subscription + Stream Processing 流计算 • 数据订阅 • 集群、高可用 高可靠、线性扩展 + 专业技术服务 • 边云数据复制 • 跨云 / 异地数据复制 • 增量备份 • 多级存储 • 工业数据接入 全托管时序数据 管理云服务平台 • 全托管服务 • VPC 对等连接 • 多云部署( AWS/Azure/ GCP) CONTENTS 自 我 介 绍 T D e n g i n e t a o s X0 码力 | 29 页 | 2.26 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串
表达式知多少 6. 通过实战案例来学习 STL 算法库 7. C++ 标准输入输出流 & 字符串格式化 8. traits 技术,用户自定义迭代器与算法 9. allocator ,内存管理与对象生命周期 ASCII 码 第 1 章 计算机如何表达字符 https://zh.wikipedia.org/wiki/ASCII 计算机如何表达字符 • 众所周知,计算机只能处理二进制 例如 “ helloworld”.replace(400, 2, “pful”) 会得到异常(和 at 同 款) • 启发性提示:因为 -1 转换为 size_t 后是个很大的数(因为补码 的规则,他实际上变成 0xffffffffffffffff ),所以可以给 len 指定 - 1 (或者 string::npos )来迫使 replace 从 4 开始一直到字符串 末尾都替换掉,例如 “ 更高效(不需 要分配一个新 string 对象)。 string_view 有的都是这些只读的函 数;没有的都是 replace 、 append 、 insert 这一类需要修改自身 的函数。 类型转换规则一览 • const char * === 隐式 ==O(n)==> string_view • string === 隐式 ==O(1)==> string_view • const char *0 码力 | 162 页 | 40.20 MB | 1 年前3
共 26 条
- 1
- 2
- 3