Likely and Unlikely in linux

从Linux内核到你的项目:likely/unlikely宏的实战搬运指南与性能陷阱 本文深入解析了Linux内核中的`likely/unlikely`宏在用户态项目中的实战应用与性能优化陷阱。通过对比内核与用户态环境的差异,提供跨编译器兼容方案,并揭示常见反模式,帮助开发者在网络服务器、游戏引擎等场景中有效提升分支预测效率。重点探讨了C语言代码优化技巧与现代CPU架构的协同工作机理。 阅读详情

在linux中判断语句经常会看到likely和unlikely,例如:

if(likely(value)){

}

else{

}

简单从表面上看if(likely(value)) == if(value),if(unlikely(value)) == if(value)。

也就是likely和unlikely是一样的,但是实际上执行是不同的,加likely的意识是value的值为真的可能

性更大一些,那么执行if的机会大,而unlikely表示value的值为假的可能性大一些,执行else机会大一些。

加上这种修饰,编译成二进制代码时likely使得if后面的执行语句紧跟着前面的程序,unlikely使得else后

面的语句紧跟着前面的程序,这样就会被cache预读取,增加程序的执行速度,likely和unlikely的实现在

include/linux/compiler.h中:

      9 #if __GNUC__ == 2 && __GNUC_MINOR__ < 96
     10 #define __builtin_expect(x, expected_value) (x)
     11 #endif
     12 
     13 #define likely(x)   __builtin_expect((x),1)
     14 #define unlikely(x) __builtin_expect((x),0)

__builtin_expect是gcc的一个预处理命令,其解释如下:

long __builtin_expect (long exp, long c)
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
value of c must be a compile-time constant. The semantics of the built-in are that it
is expected that exp == c. For example:
if (__builtin_expect (x, 0))
foo ();
would indicate that we do not expect to call foo, since we expect x to be zero. Since
you are limited to integral expressions for exp, you should use constructions such as
if (__builtin_expect (ptr != NULL, 1))
error ();
when testing pointer or floating-point values.

Linux内核中的likely和unlikely优化 分支预测能够根据历史执行信息猜测分支的结果,并在程序执行时提前加载分支目标的指令,从而减少因分支导致的流水线停顿。然而,分支预测并不总是准确的,如果分支预测错误,将导致流水线的清空和重新加载,影响程序的执行效率。likely和unlikely关键字的作用就是向编译器提供条件分支的可能性信息,以便编译器在生成机器码时做出更准确的分支预测。likely关键字用于标记条件分支成立的可能性较高的情况,而unlikely关键字则用于标记条件分支不成立的可能性较高的情况。 阅读详情

相关推荐

Linux内核中的分支预测优化:unlikely与__builtin_expect详解

本文深入解析Linux内核中的unlikely宏及其底层__builtin_expect函数的原理与应用。该宏通过向编译器提示条件表达式预期为假(如错误处理等低频事件),帮助优化代码布局:将高频执行路径紧邻主逻辑,减少CPU分支预测错误和跳转开销。文章详细阐述了其定义语法、使用场景(错误处理、异常路径等)、底层优化机制(指令重排序、流水线优化)以及验证方法(反汇编分析、perf工具)。同时对比了likely/unlikely的特性和适用场景,并指出编译器依赖、硬件影响等注意事项。最后强调合理使用这些工具需结

数字人生 238

Linux内核入门-- likely和unlikely

编译器优化时,根据条件跳转的预期值,按正确地顺序生成汇编代码,把“很有可能发生”的条件分支放在顺序执行指令段,而不是jmp指令段(jmp指令会打乱CPU的指令执行顺序,大大影响CPU指令执行效率)。我们知道目前的CPU无一例外的都引入了流水线技术,用于加快指令的执行,提高CPU的性能。在一个条件判断语句中,当这个条件被认为是非常非常有可能满足时,则使用likely()宏,否则,条件非常非常不可能或很难满足时,则使用unlikely()宏。可见,编译器利用程序员作出的判断,生成了高效的汇编码。

m0_74282605的博客 2679

避开奸商套路!手把手教你用Thaiphoon Burner和CPU-Z,一眼看穿内存SPD信息有没有被篡改

本文教你使用Thaiphoon Burner和CPU-Z工具,快速识别内存SPD信息是否被篡改,避免购买到虚标频率或假冒颗粒的内存条。通过详细步骤和实战案例,帮助用户掌握内存检测技巧,确保硬件购买的透明度和安全性。

weixin_32228501的博客 679

Linux likely、unlikely

​ 1、likely,unlikely同if else一样进行分支判断;likely 期望执行if (true)为真的分支;unlikely 期望执行 if (true) 当中的else分支, 直接运 行else分支代码。​ 2、likely, unlikely 通过分支预测指令的预取能提高代码的执行效率。

谨以此记录下自己的每一点、每一滴、每一步,以督促自己,不忘目标,不忘理想。 1651

从412到200:一步步拆解瑞数6代jsvmp的cookie生成与验证流程

本文深入解析瑞数6代JSVMP的动态安全防护机制,详细拆解从412到200状态的cookie生成与验证流程。通过剖析JSVMP虚拟机核心机制、动态元数据解析及环境检测绕过策略,为逆向工程师提供实用的技术解决方案,帮助突破瑞数6代的高级防御体系。

weixin_30342209的博客 508

Neo4j Desktop新手必看:3分钟搞定CSV数据导入(附常见报错解决方案)

本文详细介绍了在Neo4j Desktop中高效导入CSV数据的三种主流方法,包括图形化界面操作、命令行批量导入和Python驱动编程导入,并提供了常见报错解决方案和性能优化技巧,帮助新手快速构建知识图谱。

lambda的博客 647

linux内核中likely与unlikely

前言   内核版本:linux 4.13   在linux内核中,经常可以看见if( likely(x))或if( unlikely(x))语句,那么likely和unlikely是什么意思呢?本文将对likely和unlikely进行一些讨论。 likely和unlikely 参考/include/linux/compiler.h */ # define likely(x) __bu...

夜风的博客 2万+

学习笔记之——Event Camera(事件相机)调研

概述 Event Camera是一种bio-inspired sensor,对应的领域为bio-inspired vision。对于传统的相机,从某种程度上,是捕获一个静态/静止的空间,而Event Camera的目的是:敏感地捕捉运动的物体。 对于传统RGB-camera,相机传回的信息是同步的,所谓同步,就是在某一时刻t,相机会进行曝光,把这一时刻所有的像素填在一个矩阵里回传,一张照片就诞生了。一张照片上所有的像素都对应着同一时刻。至于视频,不过是很多帧的图片,相邻图片间的时间间隔...

gwpscut的博客 3万+

How do the likely/unlikely macros in the Linux kernel work and what is their benefit?

They are hint to the compiler to emit instructions that will cause branch prediction to favour the "likely" side of a jump instruction. This can be a big win, if the prediction is correct it means that the jump instruction is basically free and will take

qq_38963393的博客 274

Python小白也能玩转迅投QMT量化交易?手把手教你从安装到第一个策略

本文为零基础Python用户提供了上手迅投QMT量化交易平台的完整指南。从Python 3.6环境配置、QMT客户端获取安装,到核心概念讲解,并手把手教你编写并回测一个经典的双均线交易策略,帮助初学者快速迈出量化交易的第一步。

weixin_29103191的博客 763

SRAM故障排查实战:如何用Nano Prober定位6T存储单元的异常点

本文详细介绍了在SRAM故障排查中,如何运用Nano Prober(纳米探针)技术精准定位6T存储单元的内部异常。面对传统方法难以发现的电性参数漂移(如晶体管阈值电压偏移)或微小物理缺陷,Nano Prober能直接对单个6T单元内的晶体管进行I-V特性测量,结合失效模式分析,有效解决读写错误等疑难问题,是芯片失效分析的关键工具。

v5w6x的博客 664

Linux 中的 likely 和 unlikely

likely()、unlikely() 原理是利用了GCC 的内建函数(),通过编译器预测代码分支;GCC 编译器会将不希望的代码分支放最后;GCC 可能优先执行期盼的执行,再进行判断,不同的编译器版本实现方式不同;likely() 表示该表达式为 “True” 的概率大一些,unlikely() 表示改表达式为 “True” 的概率小一些;likely()、unlikely() 通过分支预测指令的预取能提高代码的执行效率。

私房菜 1276

SPAD IMX479规格_VOP

对于VOP的定义,很多人可能是不理解这一路的供电,实际上这一路供电是非常重要的,这是给器件SPAD供电,决定SPAD是否work,在大部分的paper以及大部分公司,基本都是叫VOP,名称是SPAD breakdown voltage power supply,严格意义上叫Operating Voltage,工作电压。当然有些公司也有一些其他叫法就不提了。其实大家可以明显的看出,典型值-20.5没有发生变化,市面上绝大多数VOP的典型值也都是在-20V这边。

致力于lidar应用开发 701

likely和unlikely的用法

在实际使用中,应该基于性能分析和测试结果来确定哪些分支更有可能和不太可能执行,并相应地使用这些宏。如果错误地使用这些宏,可能会导致性能下降,因此建议在优化代码之前进行充分的性能分析。它们通常与条件语句的分支一起使用,以指示哪些分支更有可能执行,哪些分支更不可能执行。在一般的应用程序中,使用这些宏的性能影响可能不明显,因此在普通应用程序中使用它们可能没有太大的必要。例如,在Linux内核中,通常会将likely用于可能出现的快速路径,而将unlikely用于可能出现的慢速路径,以帮助编译器更好地优化代码。

坛城的博客 1292

项目篇 | 图书管理系统 | 管理员模块 | 概述

图书管理系统管理员模块概述

百栗.的博客 403

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

内核中的 likely() 与 unlikely()

<br />内核中的 likely() 与 unlikely()<br />在 2.6 内核中,随处可以见到 likely() 和 unlikely() 的身影,那么为什么要用它们?它们之间有什么区别?<br />首先要明确:<br />            if(likely(value)) 等价于 if(value)<br />            if(unlikely(value)) 也等价于 if(value)<br />也就是说 likely() 和 unlikely() 从阅读和理解代码的

kikikind的专栏 2926

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Linux kernel的likely与unlikely

为什么使用likely与unlikely 在Linux kernel的源码中,存在这样的用法: if (likely(cond)) { ...... } if (unlikely(cond)) { ...... } likely和unlikely是宏定义,若cond为真(非0),那么likely(cond)为真;反之,若cond为假(非0),那么**likely(cond)**为假。unl...

gzxb1995的博客 1671

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Linux - likely/unlikely

从likely/unlikely宏的定义中可以看出除了第二个参数代表期望值不一样外,宏定义的其他参数都是一样的。从以上设计可以看出将指令分成更细的步骤比起串行有更高的效率,前提是提前执行的下一条指令是有效的。可以发现当编译器打开优化功能时程序的执行逻辑对于条件为真的情况相当友好,有以下优势。所以如果希望程序运行的更快的话,就需要每次读取指令/数据的命中越靠右越好。time3: 执行指令1 解释指令2 读取指令3。当希望编译器对条件为假的情况友好时,可以有以下两种方法。

ymf604的专栏 751

likely() and unlikely()

The gcc C compiler has a built-in directive that optimizes conditional branches as either very likely taken or very unlikely taken. The compiler uses the directive to appropriately optimize the branch

kernel_learner的专栏 569

Likely和unlikely 分析

第一部分 问题描述 在阅读2.6内核代码时经常出现likely()和unlikely()两个宏函数,下面来解释一下这两个宏函数的函数含义。 例如在Linux 2.6.38内核include/linux/compiler.h中,这两个宏的定义如下: #define likely(x)    __builtin_expect(!!(x), 1) #define unli

GreatChance的专栏 812

likely()与unlikely()

在linux中判断语句经常会看到likely和unlikely,例如: if(likely(value)){ } else{ } 简单从表面上看if(likely(value)) == if(value),if(unlikely(value)) == if(value)。 也就是likely和unlikely是一样的,但是实际上执行是不同的,加l...

1477

linux 中likely与unlikely用法

前言   内核版本:linux 4.13   在linux内核中,经常可以看见if( likely(x))或if( unlikely(x))语句,那么likely和unlikely是什么意思呢?本文将对likely和unlikely进行一些讨论。 likely和unlikely...

be_programmer的博客 1282

linux内核中likely和unlikely的含义

在内核代码中经常会看到unlikely和likely的踪影。他们实际上是定义在 linux/compiler.h 中的两个宏。   #define likely(x)    __builtin_expect(!!(x), )   #define unlikely(x)  __builtin_expect(!!(x), 0)   这里的__built_expect()函数是gcc的內建函数。

u013177568的专栏 654

linux中likely()和unlikely()

转自:https://www.cnblogs.com/embedded-linux/p/5943652.html likely()与unlikely()在2.6内核中,随处可见,那为什么要用它们?它们之间有什么区别呢? 首先明确: if (likely(value))等价于if (value) if (unlikely(value))等价于if (value) 也就是说likely()和unl...

博客标题不能为空 809

likely unlikely

__builtin_expect1. 代码:2. 解释:3. 原因:参考: 1. 代码: 在很多源码如Linux内核,我们都能看到likely()和unlikely()这两个宏。 通常这两个宏定义是下面这样的形式。 #define LIKELY(x) __builtin_expect(!!(x),1) #define UNLIKELY(x) __builtin_expect(!!(x),0) ...

哈尼的博客 268

likely和unlikely的区别

likely()与unlikely()在2.6内核中,随处可见,那为什么要用它们?它们之间有什么区别呢? 首先明确:  if (likely(value))等价于if (value)  if (unlikely(value))等价于if (value) 也就是说likely()和unlikely()从阅读和理解的角度是一样的。 这两个宏在内核中定义如下: #define lik

Wait for 的专栏 1900
上一篇: Linux内存初始化
下一篇: _IO, _IOR, _IOW, _IOWR 宏的用法与解析
计算机与认知
博客等级 码龄14年 31粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值