我在代码中有很多验证检查,如果任何检查失败,程序将崩溃.因此所有检查都不太可能.
if( (msg = newMsg()) == (void *)0 )//this is more unlikely
{
panic()//crash
}
Run Code Online (Sandbox Code Playgroud)
所以我使用了不太可能在分支预测中提示编译器的宏.但是我没有看到这方面的改进(我有一些性能测试).我正在使用gcc4.6.3.
为什么没有改善?是因为没有其他情况吗?我应该在构建应用程序时使用任何优化标志吗?
\n\n\n在构建应用程序时我应该使用任何优化标志吗?
\n
绝对地!即使是针对 GCC/clang/icc 的最低级别的优化-O1,也可能优于您的大部分优化工作。本质上是免费的,那为什么不呢?
\n\n\n我使用的是gcc4.6.3。
\n
GCC 4.6 很旧。您应该考虑使用现代工具,除非您受到其他限制。
\n\n\n\n\n但我没有看到任何改进(我有一些性能测试)。
\n
您还没有看到明显的性能改进,这在处理此类微优化时很常见。不幸的是,使用当今的硬件实现明显的改进并不容易:这是因为我们拥有比以前更快(快得令人难以置信)的组件。因此,节省周期并不像以前那么明智。
\n\n但值得注意的是,顺序微优化仍然可以使您的代码更快,就像在紧密循环中一样。在处理数据块时,避免停顿、分支错误预测、最大化缓存使用确实会产生影响。SO投票最多的问题清楚地表明了这一点。
\n\nGCC 手册上甚至有这样的说明:
\n\n\n\n\n\xe2\x80\x94 内置函数:long __builtin_expect (long exp, long c)
\n
\n 您可以使用 __builtin_expect 为编译器提供分支预测信息。一般来说,您应该更喜欢为此使用实际的配置文件反馈(-fprofile-arcs),因为众所周知,程序员不擅长预测他们的程序的实际执行情况。然而,有些应用程序很难收集这些数据。
(强调我的)
\nwil*_*ilx -3
请参阅 SO 上与此相关的其他答案:
ETC。
搜索它: https: //stackoverflow.com/search?q=__builtin_expect
| 归档时间: |
|
| 查看次数: |
451 次 |
| 最近记录: |