我在代码中有很多验证检查,如果任何检查失败,程序将崩溃。因此,所有检查都不太可能。
if( (msg = newMsg()) == (void *)0 )//this is more unlikely
{
panic()//crash
}
所以我使用了不太可能在分支预测中提示编译器的宏。但是我没有看到这方面的改进(我有一些性能测试)。我正在使用gcc4.6.3。
为什么没有改善?是因为没有其他情况吗?我应该在构建应用程序时使用任何优化标志吗?
答案 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)