我一直在深入研究Linux内核的某些部分,发现了如下调用:

if (unlikely(fd < 0))
{
    /* Do something */
}

if (likely(!err))
{
    /* Do something */
}

我找到了它们的定义:

#define likely(x)       __builtin_expect((x),1)
#define unlikely(x)     __builtin_expect((x),0)

I know that they are f或 optimization, but how do they w或k? And how much perf或mance/size decrease can be expected from using them? And is it w或th the hassle (and losing the p或tability probably) at least in bottleneck code (in userspace, of course).

推荐答案

它们提示编译器发出指令,使分支预测偏向跳转指令的"可能"端.这可能是一个巨大的胜利,如果预测是正确的,这意味着跳转指令基本上是免费的,将需要零个周期.另一方面,如果预测是错误的,那么这意味着需要刷新处理器管道,并且可能会花费几个周期.只要预测在大多数情况下是正确的,这将有助于提高性能.

像所有这样的性能优化一样,只有在进行了大量分析之后,才能进行优化,以确保代码真正处于瓶颈,并且可能考虑到它的微观性质,即它是在一个紧密的循环中运行的.一般来说,Linux开发人员经验丰富,所以我想他们会这么做.他们其实并不太在乎可移植性,因为他们只针对gcc,而且他们对希望它生成的程序集有着非常接近的概念.

Linux相关问答推荐

抛出主,即未捕获到SIGSEGV中的异常结果

如何创建一堆文件中所有单词的列表?

将特定列转换为行

在 Windows 上通过 SSH 运行 django 应用程序

当未在日志(log)中输入确切的时间戳时如何过滤日期范围内的值

全屏(Fullscreen)小部件

未找到框架.NETFramework,Version=v4.7.1的参考程序集

Git为每次推送输入长密码

bash 中的sed命令

如何克隆 OpenLDAP 数据库

Linux 上 pid_t、uid_t、gid_t 的大小

比较linux中两个未排序的列表,列出第二个文件中的唯一性

根据文件名模式和文件内容列出文件名?

用于提取 IP 地址的 Linux bash 脚本

bash中变量名后的2个逗号是什么意思?

如何在 Linux 中删除早于特定日期的文件?

如何在 Linux 中查看日志(log)文件并在查看时应用自定义过滤器?

当父进程被杀死时,使用 fork() 创建的子进程是否会自动被杀死?

后缀 - status=bounced(未知用户myuser)

Linux(Ubuntu)终端-如何查看以前的页面不再可见