浅谈likely与unlikely

简介:

在linux内核代码中随处可见if语句中出现likely或unlikely,这两个东西是干什么的呢?

偶然看到有人问这个问题,自己也整理一下~

likely或unlikely用于优化条件语句,其一般用法为:

3725884266736043497.jpg

条件判断之后会有两个出口,一个是真,一个是假。然而编译生成的目标代码是扁平的,其中的一个出口必须通过跳转来实现。
考虑下面一个场景:
1、判断条件;
2、条件为真跳转到4;
3、进行条件为假时的处理;
4、进行条件为真时的处理;
可见,如果条件为真,多了一次JMP操作,并且由于JMP打断了处理器流水。

likely(x)和unlikely(x)的作用是用来指导编译的,让代码在大多数情况下不会发生JMP的情况。
比如,likely(x)就告诉编译器,x在大多数情况下的结果会是真,于是编译器生成的结果为真的出口不需要JMP。unlikely(x)类似~

突然又想到一个问题,其实likely和unlikely应该只对单条件的if语句才有意义的。如果是多个条件的复合,条件表达式值的计算本身就要通过JMP来选择真假出口,所以用不用likely都影响不大。


目录
相关文章
|
XML Android开发 数据格式
android中SVG 的使用姿势
android中SVG 的使用姿势
android中SVG 的使用姿势
|
C++ 索引
vscode clangd c++开发常见问题和解决方案
vscode clangd c++开发常见问题和解决方案
2307 0
|
9月前
|
Linux 虚拟化
VMware虚拟机中Linux系统磁盘空间扩容实战
VMware虚拟机中Linux系统磁盘空间扩容实战
379 0
|
10月前
|
并行计算 物联网 测试技术
Llama-2 推理和微调的硬件要求总结:RTX 3080 就可以微调最小模型
大语言模型微调是指对已经预训练的大型语言模型(例如Llama-2,Falcon等)进行额外的训练,以使其适应特定任务或领域的需求。微调通常需要大量的计算资源,但是通过量化和Lora等方法,我们也可以在消费级的GPU上来微调测试,但是消费级GPU也无法承载比较大的模型,经过我的测试,7B的模型可以在3080(8G)上跑起来,这对于我们进行简单的研究是非常有帮助的,但是如果需要更深入的研究,还是需要专业的硬件。
885 0
|
监控 Linux 数据中心
在阿里云容器服务ACK下启用cgroup v2
Kubernetes采用CGroup实现容器的资源隔离。CGroup分为V1和V2版本,V2版本提供了更一致的体验和更丰富的功能。例如, 支持CGroup级别的eBPF挂载,可以实现Pod级别的资源监控、网络重定向等, 基于eBPF的网络优化也依赖于它。 本文介绍如何在阿里云容器服务ACK下启用cgroup v2。
538 1
|
人工智能 算法 Cloud Native
KeenTune—智能化调优&容量评估
阿里QA导读:亲爱的小伙伴们,还记得上个月圆满落幕的TICA2022大会吗?应大家要求,我们将为大家深入解读一些Topic。今天的文章来自TICA大数据&智能化分会场,读完后,你对KeenTune(轻豚)这款优秀的智能优化产品会有更深入的了解。
1143 0
KeenTune—智能化调优&容量评估
|
运维 安全 Linux
Linux文件通配符进阶及cp命令详解| 学习笔记
快速学习Linux文件通配符进阶及cp命令详解
852 0
 Linux文件通配符进阶及cp命令详解| 学习笔记
|
MySQL 关系型数据库 内存技术
MySQL · 新特性分析 · CTE执行过程与实现原理
众所周知,Common table expression(CTE)是在大多数的关系型数据库里都存在的特性,包括ORACLE, SQLSERVER,POSTGRESQL等,唯独开源数据库老大MySQL缺失。CTE作为一个方便用户使用的功能,原本是可以利用普通的SQL语句替代的,但是对于复杂的CTE来说,要模拟出CTE的效果还是需要很大的功夫。如果考虑性能那就更是难上加难了。2013年Guilhem
4107 1
|
存储 关系型数据库 MySQL
【mysql】SET类型
【mysql】SET类型
377 0
【mysql】SET类型