linux中 likely与unlikely

看内核时总遇到if(likely( )){}或是if(unlikely( ))这样的语句,最初不解其意,现在有所了解,所以也想介绍一下。

likely() 与 unlikely()是内核(我看的是2.6.22.6版本,2.6的版本应该都有)中定义的两个宏。位于/include/linux/compiler.h中,
具体定义如下:
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)

__builtin_expect是gcc(版本>=2.96,网上写的,我没验证过)中提供的一个预处理命令(这个名词也是网上写的,我想叫函数更好些),有利于代码优化。gcc(version 4.4.0)具体定义如下:
long __builtin_expect (long exp, long c) [Built-in Function]

注解为:
You may use __builtin_expect to provide the compiler with branch prediction information. In general, you should prefer to use actual profile feedback for this (‘-fprofile-arcs’), as programmers are notoriously bad at predicting how their programs actually perform. However, there are applications in which this data is hard to collect.The return value is the value of exp, which should be an integral expression. The semantics of the built-in are that it is expected that exp == c.

它的意思是:我们可以使用这个函数人为告诉编绎器一些分支预测信息“exp==c” 是“很可能发生的”。

#define likely(x) __builtin_expect(!!(x), 1)也就是说明x==1是“经常发生的”或是“很可能发生的”。
使用likely ,执行if后面语句的可能性大些,编译器将if{}是的内容编译到前面, 使用unlikely ,执行else后面语句的可能性大些,编译器将else{}里的内容编译到前面。这样有利于cpu预取,提高预取指令的正确率,因而可提高效率。

举个例子(内核版本2.6.22.6):/kernel/shed.c中有一段:
if (likely(!active_balance)) {
/* We were unbalanced, so reset the balancing interval */
sd->balance_interval = sd->min_interval;
} else {
/*
* If we've begun active balancing, start to back off. This
* case may not be covered by the all_pinned logic if there
* is only 1 task on the busy runqueue (because we don't call
* move_tasks).
*/
if (sd->balance_interval max_interval)
sd->balance_interval *= 2;
}

编译过程中,会将if后面{}里的内容编译到前面,else 后面{}里的内容编译到后面。若将likely换成unlikely 则正好相反。

总之,likely与unlikely互换或不用都不会影响程序的正确性。但可能会影响程序的效率。


if(likely(foo))  //认为foo通常为1

if(unlikely(foo)) //认为foo通常为0


感谢各位光顾!
不知道有没有写清楚,望指正!
疑惑:
为什么likely或是unlikely要定义成__builtin_expect(!!(x), 1),而不直接用__builtin_expect(x, 1)?" !!(x) "与" x "有什么不同?

另外内核2.6.31.5中likely和unlikely还有一种定义:
# ifndef likely
# define likely(x) (__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 1))
# endif

# ifndef unlikely
# define unlikely(x) (__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 0))
# endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432649.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win10 iis网站服务器,windows10如何搭建IIS服务器

web服务器无处不在,本次教程主要简单介绍一个简单的web服务IIS,IIS主要适用于ASP.NET、ASP等语言使用。1、打开控制面选择程序和功能2、点击启用或关闭windows功能打开一个小框框提供给用户配置相关软件,本次主要打开IIS功能 ,具体…

表格数字乘以百分比怎么算_EXCEL记住这两个快捷键,1秒种设好数字格式

你还在用右键设置单元格格式来设置千分位吗?你还在用右键设置单元格格式来设置百分比吗?今天小马教大家两个快捷键,记住这两个快捷键,1秒钟设好数字格式。设置数字的千分位 CtrlShift1可能这个数字比较难记,可以把1想象…

设备树使用手册

设备树使用手册This page walks through how to write a device tree for a new machine. It is intended to provide an overview of device tree concepts and how they are used to describe a machine.本文将介绍如何为一个新机器编写设备树。我们准备提供一个有关设备树概…

查看服务器文件夹,远程查看服务器文件夹内的文件夹

远程查看服务器文件夹内的文件夹 内容精选换一换请使用Mind Studio的安装用户进行升级操作,在升级前请先登录到后台服务器,切换到root用户在/usr/bin目录下执行./add_sudo.sh username脚本进行加权操作,使用命令为:界面参数解释如…

linux tao环境 安装_Linux安装jdk8及环境变量配置

众所周知,Java项目部署到Linux服务器运营是需要Java运行环境jdk的,接下来我就总结一下我自己的见解(如有意见、建议欢迎各位指教)。前言:搭建环境,所需要的安装包、工具例如:Xshell、FileZilla、…

A5D2 GPIO测试

1. 首先构建设备树,此例中,测试两个GPIO管脚,一个做输入中断,一个做输出 每个GPIO需要分别描述,其中,label随意,pioA后面的数字,可以在sama5d2-pinfunc.h文件中找到 这是管脚功能复用…

易飞erp怎么修改服务器ip,易飞连接失败处理方法

●问题描述:所有客户端登陆易飞报错:LeaderWorkCenterADO连接失败1.确认SQL Server的sa密码和易飞系统控制管理员的密码是否一致,重新授权一下;基本就可以解决问题啦!2.如果还是不行,检查一下数据源中是否有…

中如何计算工龄_在Substrate中如何计算交易权重

建议在阅读本文之前,先掌握关于Substrate中交易费用设计的基本概念。如果还没有了解的童鞋,请移步: Kaichao:Substrate 区块链应用的交易费用设计​zhuanlan.zhihu.com读完Substrate区块链应用的交易费用设计的小伙伴,…

wince 6.0 pb

1)删除目录C:/Program Files/Microsoft Platform Builder/6.00下的EtkRemov.inf文件 2)修改系统时间到未来某个时间点 3)新建一个文本文档 4)重命名新建文本文档为EtkRemov.inf 5)改回系统时间

安卓文件共享服务器,安卓文件共享云服务器

安卓文件共享云服务器 内容精选换一换华为云帮助中心,为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档,帮助您快速上手使用华为云服务。内网环境下,Windows云服务器之间怎样实现文件夹共…

linux curl命令验证服务器断点续传支持

有个同事说,发现现在对外下载安装包的服务器不支持断点续传,我听了一阵纳闷,lighttpd server对于静态文件应该默认支持断点续传的,登机器查看lighttpd配置文件发现 对断点续传的支持被禁用了,lighttpd的说明里对该配置…

代码补全_AI加持,Kite增加智能代码补全功能:减少一半操作,实时补全

代码补全工具 Kite 近日更新了最新的版本,增加了名为「Intelligent Snippets」的新功能。这一功能可以帮助开发者更为智能和高效的补全 Python 代码中的函数命令了。机器之心报道,机器之心编辑部。Kite 是一个著名的 Python 代码补全工具,支持…

Linux workqueue工作原理

1. 什么是workqueue Linux中的Workqueue机制就是为了简化内核线程的创建。通过调用workqueue的接口就能创建内核线程。并且可以根据当前系统CPU的个数创建线程的数量,使得线程处理的事务能够并行化。workqueue是内核中实现简单而有效的机制,他显然…

微信获取token服务器处理,微信硬件平台(九) 自己的服务器从微信获取token并保存txt...

1安装crontab:yum install crontabs说明:service crond start //启动服务service crond stop //关闭服务service crond restart //重启服务service crond reload //重新载入配置查看crontab服务状态:service crond status手动启动crontab服务&#xff1a…

Tomcat项目部署过程中的问题

1.项目发布问题 将发布的war包放置在webapp下时,点击bin目录中的startup.bat时,出现黑框一闪, 采用cmd登录时出现 The JRE_HOME environment variable is not defined correctly 2.问题是环境变量没有配置好 下面进行系统的配置(前…

centos8 默认nginx路径_CentOS 8系统安装Nginx Web服务器及常见配置过程

Nginx是一种快速、轻量级的Web服务器,优势是Nginx的配置文件非常简单易用。它是Apache Web服务器的绝佳替代品。在本文中,惠主机将简单介绍如何在CentOS 8上安装Nginx Web服务器和常见基本配置过程。安装NginxNginx在CentOS 8的官方软件包存储库中可用。…

思科模拟服务器怎么写文件,思科模拟服务器配置教程

思科模拟服务器配置教程 内容精选换一换部署游戏应用前,您需要准备硬件以及华为云的环境,主要包括以下内容:硬件环境:您需要准备一台带有显卡的Windows机器,硬盘至少20G,用于运行游戏客户端。若您不需要运行…

vs2013编译osg缺少mfc120d.lib

因为MFC MBCS DLL缺少导致的,微软的解释如下(http://msdn.microsoft.com/en-us/library/dn251007.aspx): MFC libraries (DLLs) for multibyte character encoding (MBCS) are no longer included in Visual Studio, but are avai…

【转载】MongoDB 1000W级数据 Insert和Query和Delete性能测试

加索引测试: > db.users.getIndexes() [ { "name" : "_id_", "ns" : "test.users", "key" : { "_id" : …

名词解释说明用英语怎么说_“恍然大悟”用英语怎么说?

当我们对思考已久的事情,突然明白或醒悟时,可以说是“恍然大悟”了。那么问题来了,“恍然大悟”用英语该怎么说呢?① it occurs to me这是一个使用频率很高的表达,日常生活中经常会用到。在美剧《摩登家庭》中&#xf…