C++高性能并行编程与优化 - 课件 - 17 由浅入深学习 map 容器[k, v] 是对 map 里面真正 K-V 对的一份深拷贝。你写入的只是这份拷贝 后的 V ,不是 map 中的那个 V 。 map 的遍历:遍历的同时修改怎么办? k v map 中的 堆空间 执行你这段代码 的栈空间 未初 始化 v2 要写入的数 执行中的代码 for (auto [k, v]: m) { v = v2; } • 我们现在遍历一个 map ,然后把他里面所有的 [k, v] 是对 map 里面真正 K-V 对的一份深拷贝。你写入的只是这份拷贝 后的 V ,不是 map 中的那个 V 。 map 的遍历:遍历的同时修改怎么办? k v map 中的 堆空间 执行你这段代码 的栈空间 k v v2 要写入的数 执行中的代码 for (auto [k, v]: m) { v = v2; } • 我们现在遍历一个 map ,然后把他里面所有的 ,不是 map 中的那个 V 。 map 的遍历:遍历的同时修改怎么办? k v map 中的 堆空间 执行你这段代码 的栈空间 k v2 v2 要写入的数 执行中的代码 for (auto [k, v]: m) { v = v2; } 你修改的是栈空间 ( 周树人 ) 管我堆空间 ( 鲁迅 ) 什么事? • 我们现在遍历一个 map ,然后把他里面所有的 V 都设为 v2 ,要怎么做?0 码力 | 90 页 | 8.76 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 性能优化之无分支编程 Branchless Programmingnet/techtips/x86-jumps.html 手动进行无分支优化的方法 无分支优化:从汇编角度分析 • 发生了什么?让我们把源码和汇编逐个对应。 • x 是第一个参数(通过 edi 传入,被存入 rbp 指向的堆 栈) • 比较 x 和 0 的大小( cmp 命令把刚存入堆栈的 x 和 0 比较) • 这里 x > 0 返回的是一个 bool 类型(通过指令 setg al 求出) • bool 但是很多时候并不是单独的一个分支。那 么“妙用加减乘”计算量就会很大,而且写起 来也麻烦。 存在大量分支的情形 • 很多同学通常都会用 switch 来处理这种 大量判断的情况。可能你误以为 switch 比一堆 if-else 更高效。但是实际上在编译 器看来是一样的,不管你 if-else 还是 switch ,他都会想方设法帮你优化成查表 法。 • 所以不用纠结性能,你觉得哪种写起来可 读性强,容易维护,你就怎么写。 • 这个表里每个元素就是原来要返回的一个个 值,索引就是要判断的参数 x 。 • 因为查表只需要一个指针的加法和读取操作 ,复杂度是 O(1) 的;运算量远远小于最坏 需要 n 次判断的一堆 if-else ,复杂度是 O(n) 的。因此用查表法去优化有很多次连 续判断的 if-else 会比较赚。 查表法的确定:如果 x 有可能越界,则需要特殊判断 • 不过刚刚的写法无法处理0 码力 | 47 页 | 8.45 MB | 1 年前3
Zadig 面向开发者的云原生 DevOps 平台-> GitLab-CI 自动构建打包 Chart (写一堆复杂 的脚本 ) -> -> Rancher 上手动替换 Helm Chart 版本 -> 调试 (使用 kubectl/ 日志系统) 2. 测试流程 合并到 develop -> GitLab-CI 自动构建打包 Chart (还是那堆复杂的脚 本) -> -> Rancher 上手动替换 关联到开发工作流中,为开发提供自动化验证保障 效能提升场景: 2K+ 微服务、多语言、 Helm 、 K8s 多集群 1. 维护成本高昂 2. 交付效率低下 3. Chart 版本管理混乱 1. 一堆复杂的脚本 2. Rancher 上手动替换版本 3. 测试环境不透明,总出问题 4. 每次部署都需要产生一个 Chart 版 本 效能提升场景:现状的痛点分析 效能提升场景:0 码力 | 59 页 | 81.43 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 12 从计算机组成原理看 C 语言指针的重载了。 • 在现代 C++ 中,建议始终用 nullptr ,不 要再用 NULL 和 0 表示空指针了,不安全 。 来看看 GLIBC 的源码 数组的本质究竟是什么? 数组就是一堆在内存中紧密排列在一起的数 • 例如一个由 4 个字节组成的 char 数组,在内存中就是: 实验: char 类型数组 • 可以通过 char a[4] = {...} 来创建一个数组。 • 栈上不能动态分配内存,堆上就可以! • char a[4] 可以在编译期确定一片栈上的连 续内存,大小为 4 字节, 4 必须是常量 。 • 而调用 stdlib.h 的 malloc(n) 就可以从堆 上分配一段 n 字节的连续内存,这里的 n 就可以不是常量了。 • 栈上的内存会在函数退出时自动释放,而 堆上的内存不会,需要手动 free(a) 释放 。 动态数组作为函数参数?不仅要传首地址,还要传数组长度! 内存,堆上内存是持久的,只要你不手动 free 他就一直在那里。 • 这样函数退出时不会释放数组,调用者就 可以访问到正确的数据了。 • 当然这样需要调用者在退出时手动调用一 下 free(a) ,因为堆内存不会自动释放。 太复杂了?没关系,用 C++ 的容器库 • 如果你觉得这样自己管理内存太麻烦了,那是 正常的。对于不精通 C 语言的小白程序员来 说,很容易就忘记释放内存了。 • 因此 C++0 码力 | 128 页 | 2.95 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 14 C++ 标准库系列课 - 你所不知道的 set 容器C++17 引入了个语 法糖:基于范围的 for 循 环 (range-based for loop) 。 • for ( 类型 变量名 : 可迭代对象 ) • 这种写法,无非就是刚才 那一大堆代码的简写: set 的遍历 • 基于范围的 for 循环只是 一个简写,他会遍历整个 区间 [begin, end) 。 • 有时写完整版会有更大的 自由度,也就是说这里的 begin 和 &val) const; 查找 multiset 中的等值区间 • equal_range 返回的等值区间, 可以求长度,也可以遍历。 • 对 multiset 而言遍历似乎没什么 用,反正都是一堆相等的元素。 • 求长度也没什么用,可以用 count 替代,总之就是非常尴尬 。 • 但之后说到 multimap 的时候这 个函数就会很有用了,下节课再 说。 • pair0 码力 | 83 页 | 10.23 MB | 1 年前3
JVM 内存模型Stack Native Method Stack PC Register JVM Stack Native Method Stack 程序计数器、虚拟 机栈, native 栈 为线程私有 堆为线程共享 方法区为线程共享 Eden From Survivor To Survivor 新生代 Old Space 老年代0 码力 | 1 页 | 48.42 KB | 1 年前3
Zadig 产品使用手册支持多个服务并行构建部署、产品级发布,可 灵活安全接入多个代码仓及周边工具链 开发 Zadig 核心特性: 运维 真正意义的持续交付:以工程师体验为核心,价值交付为理念,完成需求到发布的全路径。 测试 发布 洞察 一堆复杂脚本、维护成本极高 员工手工操作费时费力易出错 手动更新服务、手动打包、交付 付效率低下、占据大量研发时间 、研发利用率极低 环境不透明、测试效率低下、测 试有效性低、大量手工、价值难 以体现0 码力 | 52 页 | 22.95 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 01 学 C++ 从 CMake 学起C++ Fortran GNU gcc g++ gfortran LLVM clang clang++ flang 多文件编译与链接 • 单文件编译虽然方便,但也有如下缺点: 1. 所有的代码都堆在一起,不利于模块化和理解。 2. 工程变大时,编译时间变得很长,改动一个地方就得全部重新编译。 • 因此,我们提出多文件编译的概念,文件之间通过符号声明相互引用。 • > g++ -c hello0 码力 | 32 页 | 11.40 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程等常用库(大概) • GPU 红黑高斯 + 多重网格实战 • 继续锐评黄某勋 • 感兴趣的扣 1 • OpenMP 新特性( parallel for 之外的) • SIMD 指令全解析( mm 开头那堆) • 内存与缓存优化进阶(第七课的延伸) • 二分查找法优化案例(针对缓存行的) • eigen 、 glm 、 vectorclass 等常用库(可能) • CPU 红黑高斯 + 多重网格实战0 码力 | 142 页 | 13.52 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串com/cn/6211/ MSVC 经典笑话:烫烫烫屯屯屯 • Windows 的 MSVC 在 Debug 模式下会默认把未初始化的栈内存 填满 0xCC ( x86 的 INT3 单步中断指令),未初始化的堆内存填 满 0xCD 。 • 而 0xCCCC 在 GBK 编码中就是“烫”,所以如果不小心打印了栈上 未初始化的字符串数组,就会看到“烫烫烫”。 • 而 0xCDCD 在 GBK 编码中就是“屯”,所以如果不小心打印了堆上0 码力 | 162 页 | 40.20 MB | 1 年前3
共 10 条
- 1













