为什么不可能/不太可能显示性能改进?

spo*_*ara 5 c++ performance

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

if( (msg = newMsg()) == (void *)0 )//this is more unlikely
{
    panic()//crash
}
Run Code Online (Sandbox Code Playgroud)

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

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

edm*_*dmz 5

\n

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

\n
\n\n

绝对地!即使是针对 GCC/clang/icc 的最低级别的优化-O1,也可能优于您的大部分优化工作。本质上是免费的,那为什么不呢?

\n\n
\n

我使用的是gcc4.6.3。

\n
\n\n

GCC 4.6 很。您应该考虑使用现代工具,除非您受到其他限制。

\n\n
\n

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

\n
\n\n

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

\n\n

但值得注意的是,顺序微优化仍然可以使您的代码更快,就像在紧密循环中一样。在处理数据块时,避免停顿、分支错误预测、最大化缓存使用确实会产生影响。SO投票最多的问题清楚地表明了这一点。

\n\n

GCC 手册上甚至有这样的说明:

\n\n
\n

\xe2\x80\x94 内置函数:long __builtin_expect (long exp, long c)
\n 您可以使用 __builtin_expect 为编译器提供分支预测信息。一般来说,您应该更喜欢为此使用实际的配置文件反馈(-fprofile-arcs),因为众所周知,程序员不擅长预测他们的程序的实际执行情况。然而,有些应用程序很难收集这些数据。

\n
\n\n

(强调我的)

\n