培训学校 高端培训课程( 七 )


培训学校 高端培训课程

文章插图

优化选项也是另外一个和性能关系很大的东西 , 像 GCC 下面有一大堆的优化选项 , 细分的话大概一共有100多个 , 这里就不一一例举了 。我们看一个很具体的例子 。
培训学校 高端培训课程

文章插图

这个例子里面 , 我有3个测试 , 一组测试是 sort 加上一个函数对象 , 我用的是 less;然后是 sort 加上一个普通的函数 , 就是你写一个函数来比较两个东西的大小 , 我利用这个函数指针去传给sort 来进行排序;还有一个就是 C 里面就有的 qsort , 也是利用一个普通函数来进行排序 。我们会发现在 O0 的情况下 , C 性能会比 C++ 的要高 , 但一旦你开到了 O2 , C++ 代码的性能就反过来比 C 的要高出很多了 。而且我们可以看一下 O2 对 O0 的性能提升 , 在 sort 加函数对象的情况下是14倍的性能提升 , 而对于 qsort 是 1.57倍 , 换句话说 , 在 C 的年代 , 你可能可以承受得了不开O2、O3 , 但在 C++ 的年代里恐怕有点难 , 因为你不开这些优化选项的话 , 你这个代码可能会发现性能很低 , 因为标准库里的很多东西 , 如果你不开优化 , 特别是没有 inline 的话 , 是绝对不可以的 , 因为 inline 不 inline , 本身就可以带来一个数量级的性能差异 。
培训学校 高端培训课程

文章插图

我们看一下这张图 , 上边左边是sort_with_func , 中间是 sort_with_less , 这两个就是前面说的使用函数指针和使用函数对象 。我们可以发现这个函数调用非常复杂 , 就是因为 sort 函数里实际上是有很多层的函数调用 。C++ 里有很多小函数 , 每一个的圈复杂度都比较低 , 而 C 的话 , 大家会发现它的函数调用层次不深 , 就这么几个函数 , 所以它能够容忍你没有inline、没有优化 , 都还可以 。但是 C++ 里就不行 。C++里你要达到比较好的性能 , 一定要开高优化 , 一定要打开inline 。
培训学校 高端培训课程

文章插图

培训学校 高端培训课程

文章插图

培训学校 高端培训课程

文章插图

Q&A
Q. 函数对象为什么比纯函数快?
A. 因为函数对象比纯函数更容易被内联 , 这是最主要的优化点 。


Q. 采样测试需要权限吗?
A. 采样测试用perf一般需要root权限 。如果没有root权限 , 可以考虑使用 Google Perftools 。


Q. 虚函数和模板?
A. 模板是静态多态 , 虚函数是动态多态 。一般来讲 , 模板能够做到更高的性能 。


Q. 编程语言的抽象性影响性能是什么意思?
A. 是指你写下一行语句 , 有可能不知道背后发生了些什么事情 , 你需要理解这个语句背后发生了什么事情 , 你才知道这个东西对性能有什么关系 。


Q. 工程上很多的性能瓶颈来自于加锁、IO 等 , 那对于 C++ 语言本身的一些优化是否一般来说并不是性能瓶颈?
A. 我觉得不会这么说 , 因为首先你需要理解什么情况下该使用加锁 , 什么情况下不需要使用加锁 。其次 , 当解决了一些其他的瓶颈之后 , 语言本身就可能会成为瓶颈 。我们肯定不希望瓶颈一直是在加锁或 IO上 , 一定是要想到办法把这些瓶颈撸掉 , 而且在这个过程中你也需要利用到 C++ 的一些特性 。


特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。