C++高性能并行编程与优化 - 课件 - 04 从汇编角度看编译器优化编译器优化:代数化简 编译器优化:常量折叠 编译器优化:举个例子 编译器优化:我毕竟不是万能的 结论:尽量避免代码复杂化,避免使用会造 成 new/delete 的容器。 简单的代码,比什么优化手段都强。 造成 new/delete 的容器:我是说,内存分配在堆上的容器 • 存储在堆上(妨碍优化): • vector, map, set, string, function, any • 描述中和老师分享你的思考 那改用 array 试试? 那改用手写的 reduce ? 那改小到 10 ?成功了! 结论:代码过于复杂,涉及的语句数量 过多时,编译器会放弃优化! 简单的代码,比什么优化手段都强。 constexpr :强迫编译器在编译期求值 结论:如果发现编译器放弃了自动优化,可以 用 constexpr 函数迫使编译器进行常量折叠! 不过, constexpr 函数中无法使用非0 码力 | 108 页 | 9.47 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 性能优化之无分支编程 Branchless Programming低效,也可能高效,要测试才知道。 • 抛开性能不谈,从可读性和可维护性上来 说, map 是完胜的,不再需要重复打字 } else if (...) { 了,因此我仍十分推荐用 map 。 不得不分支时可以采取的优化手段: likely 和 unlikely 除了 if-else 分支之外:函数指针也是一种分支,也有预判的开销 • 函数调用相当于无条件跳转指令: jmp label 或者说 call label0 码力 | 47 页 | 8.45 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化blockSize*nblur 改进:只对 X 循环做分块 • 反而变慢了,是怎么回事? • 记得小彭老师说过,性能优化讲究组合拳,光看一 个改动有没有提升是不科学的。 • 所以我们再尝试配合一下其他优化手段,看看有没 有效果吧。 使用预取指令 • 反而更加慢了? • 可能是因为写入了 b 污染了一级缓存,导 致预取效果不好,我们用直写指令试试看 。 使用直写指令 • 反而更加更加慢了?0 码力 | 147 页 | 18.88 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串string 的空基类优化 • 首先映入眼帘的是 _Alloc_hider 这个奇怪的类,包装了一 下首地址指针 _M_p 。为什么要套这一层壳?这其实是为 了防止 allocator 对象浪费空间的优化手段。俗称空基类 优化,问题来了,为什么需要空基类优化? string 的空基类优化 • 如果不优化的话,是会把 allocator 直接作为成员变量放 在 basic_string 里的,但是因为0 码力 | 162 页 | 40.20 MB | 1 年前3
共 4 条
- 1













