c++ - 使用 __builtin_expect() 或 Linux 内核时 "very likely"的可能性和可能性是多少

标签 c++ c performance built-in

您应该只使用__builtin_expect()或 Linux 内核的 likely()unlikely()如果您的代码“很可能”遵循预测的分支。 “很有可能”是多少?

我正在开发一个数据包嗅探器程序。我的程序从 2 个 NIC 捕获数据包并将它们保存在 2 个独立的缓冲区中。我预计从 NIC 1 收到 25 个数据包后,从 NIC2 收到 1 个数据包。

所以,我需要使用 if 语句,例如:

if (_received_from_nic1) {
    _Connection_Number++;
} else {
    _Session_Number++;
}

那么,这种情况适合使用__builtin_expect()吗?或 Linux 内核的 likely() ? 这种情况是否满足“很可能”的条件?

最佳答案

很难相信网络代码中可能存在 CPU 性能瓶颈。
即使有,分支预测器也没有理由在这里失败,而且分支预测器现在确实很好。
即使这种优化是有原因的,执行配置文件引导 (PGO) 也比用一些特定于平台且难以阅读的代码堵塞源代码要明智得多。

一般来说,“帮助编译器”通常是一个坏主意。在某些情况下它可能很有用,但确实很难想出这些。
likely()/unlikely() 的情况下,如果您知道确切的目标平台,并且知道它是一些完全没有分支预测的特定 CPU,那么也许您可以从中得到一些东西,否则可能是浪费时间。

关于c++ - 使用 __builtin_expect() 或 Linux 内核时 "very likely"的可能性和可能性是多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41083333/

相关文章:

c++ - 从 Windows 迁移到 Ubuntu

c++ - 如何与私有(private)嵌套类成为 friend

c++ - 从 std::stringstream 检索 char

java - 在 Java 和 C++ 中增加计数器的最佳方法?

c++ - 模仿 socket.h (C++) 的 OpenSSL 包装器

C - fscanf 在文件结束之前引发 EOF

performance - 使用 FFMPEG 提取缩略图在大型视频文件上 super 慢?

c - 在 C 中使用 putchar() 打印 int

php - 性能:在单个查询而不是多个查询中从 5 个表获取并分组产品详细信息?

mysql - 内部联接中的临时表与子查询