C++ 为什么不';不太可能/不太可能显示性能改进?

C++ 为什么不';不太可能/不太可能显示性能改进?,c++,performance,C++,Performance,我在代码中有很多验证检查,如果任何检查失败,程序就会崩溃。因此,所有的检查都不太可能 if( (msg = newMsg()) == (void *)0 )//this is more unlikely { panic()//crash } 因此,我使用了宏“不太可能”,它在分支预测中提示编译器。但是我没有看到这方面的改进(我有一些性能测试)。我使用的是gcc4.6.3 为什么没有改进?是不是因为没有其他理由?在构建我的应用程序时,我是否应该使用任何优化标志?请参阅与此相关的其他答案,

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

if( (msg = newMsg()) == (void *)0 )//this is more unlikely
{
    panic()//crash
}
因此,我使用了宏“不太可能”,它在分支预测中提示编译器。但是我没有看到这方面的改进(我有一些性能测试)。我使用的是gcc4.6.3


为什么没有改进?是不是因为没有其他理由?在构建我的应用程序时,我是否应该使用任何优化标志?

请参阅与此相关的其他答案,以便:

等等

搜索它:

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

绝对是!即使是最低级别的优化,GCC/clang/icc的-O1,也可能比您的大多数优化工作表现更好。基本上是免费的,为什么不呢

我使用的是gcc4.6.3

GCC 4.6已经过时。你应该考虑使用现代工具,除非你有其他的限制。

但是我没有看到这方面的改进(我有一些性能测试)

您还没有看到明显的性能改进,这在处理类似的微优化时非常常见。不幸的是,用今天的硬件实现可见的改进并不容易:这是因为我们拥有比过去更快(难以置信地快)的组件。因此,节约周期不像过去那样明智

不过值得注意的是,顺序微优化仍然可以使代码更快,就像在紧循环中一样。在处理数据块时,避免暂停、分支预测失误、最大限度地利用缓存确实会产生不同。这清楚地表明了这一点

GCC手册中甚至规定:

-内置函数:long\uu内置函数\u expect(long exp,long c)
您可以使用_ubuiltin_u,以向编译器提供分支预测信息一般来说,您应该更喜欢使用实际的配置文件反馈(-fprofile arcs),因为程序员在预测其程序实际执行情况方面是出了名的糟糕。但是,有些应用程序很难收集这些数据


(emphasis mine)

这么多数据很难判断,但可能仅仅是因为您给编译器的提示已经被考虑过了?可能的/不可能的宏的性能提升可能只是几个处理器周期。也许您的性能测试只能精确到几微秒甚至几毫秒。即使没有宏,编译器也可能生成了最佳的代码。如果你想提高代码的性能,不要猜测。你会错的。描述它,知道你需要做什么。见答案中罗斯·罗杰斯的第二条评论。它基本上说,Advanced CPU可能有自己的分支预测器,它可以完成不太可能完成的工作。默认情况下,gcc已经将p==0预测为false(尽管概率不如使用uu builtin_expect那样高)。您可以尝试
-fdump tree all
,它显示一些估计的概率。