为什么不可能/不太可能表现出性能改善?

时间:2015-12-09 11:55:37

标签: c++ performance

我在代码中有很多验证检查,如果任何检查失败,程序将崩溃。因此,所有检查都不太可能。

if( (msg = newMsg()) == (void *)0 )//this is more unlikely
{
    panic()//crash
}

所以我使用了不太可能在分支预测中提示编译器的宏。但是我没有看到这方面的改进(我有一些性能测试)。我正在使用gcc4.6.3。

为什么没有改善?是因为没有其他情况吗?我应该在构建应用程序时使用任何优化标志吗?

2 个答案:

答案 0 :(得分:3)

  

在构建我的应用程序时,我应该使用任何优化标志吗?

绝对!即使优化率达到最低水平,GCC / clang / icc的-O1也可能超过大多数优化工作。基本上是免费的,为什么不呢?

  

我正在使用gcc4.6.3。

GCC 4.6 old 。您应该考虑使用现代工具,除非您另有约束。

  

但我看到没有改进(我有一些性能测试)。

您还没有看到可见的性能改进,这在处理像这样的微优化时非常常见。不幸的是,使用当今的硬件实现可见的改进并不是很容易:这是因为我们的组件速度比以往更快(难以置信的更快)。因此,节省周期并不像以前那么明智。

虽然值得注意的是,顺序微优化仍然可以使代码更快,就像在紧密循环中一样。在处理数据块时,避免停顿,分支错误预测,最大化缓存使用会有所不同。 SO's most voted question清楚地表明了这一点。

它甚至在GCC手册中说明:

  

- 内置函数:long __builtin_expect(long exp,long c)
  您可以使用__builtin_expect为编译器提供分支预测信息。 一般情况下,您应该更喜欢使用实际的配置文件反馈(-fprofile-arcs),因为程序员在预测程序实际执行情况方面非常糟糕。但是,有些应用程序中的数据是很难收集。

(强调我的)

答案 1 :(得分:-3)