博客摘录「 性能优化:__builtin_expect详解」2024年1月15日

2024-01-16 10:52

本文主要是介绍博客摘录「 性能优化:__builtin_expect详解」2024年1月15日,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

性能优化:__builtin_expect详解___builtin_expect对性能的影响-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/chudongfang2015/article/details/75710848

#define LIKELY(x) __builtin_expect(!!(x), 1)

__builtin_expect宏定义中为何写成!!(x)?

首先__buildin_expect(x, a)意味着很可能x==a。

然而x==2时,x也是true,但x!=1。

所以!!(x)可以保证x==true时,!!(x)==1。

[lammy@localhost test_builtin_expect]$ gcc -fprofile-arcs -O2 -c test_builtin_expect.c 
[lammy@localhost test_builtin_expect]$ objdump -d test_builtin_expect.o

这句命令是使用GCC编译器编译C语言源文件。下面是对每个部分的解释:

  • gcc: 这是GNU编译器集合(GNU Compiler Collection)的命令行接口。GCC是一个用于编译C、C++、Fortran等多种语言的编译器。
  • -fprofile-arcs: 这个选项用于生成程序的边计数(branch profiling)信息。边计数是一个分析程序控制流的方法,它可以帮助编译器优化代码。
  • -O2: 这是一个优化级别选项。-O2表示编译器应执行一系列的优化,包括一些对代码大小和运行时间的优化。
  • -c: 这个选项告诉编译器只编译源文件,不进行链接。编译后的目标文件(通常是.o文件)将输出到标准输出。
  • test_builtin_expect.c: 这是要编译的C语言源文件的名称。

综合起来,这条命令的意思是:使用GCC编译器编译test_builtin_expect.c源文件,在编译过程中启用边计数,进行中级优化,并只输出编译后的目标文件到标准输出。

objdump 是一个用于显示二进制文件信息的工具,它可以显示编译后的目标文件、可执行文件或库的各种详细信息。-d 选项是告诉 objdump 进行反汇编,也就是将机器代码转换成汇编语言代码。

所以,当你运行以下命令:

 

bash复制代码

objdump -d test_builtin_expect.o

你将会得到 test_builtin_expect.o 文件的反汇编输出。每一行会显示对应的机器代码和对应的汇编语言代码。

注意:这个命令会显示目标文件中的所有函数和全局变量的汇编代码。如果你只对特定的函数或变量感兴趣,你可能需要进一步过滤或搜索反汇编输出。

。让我们详细解释一下这个指令:

je 2d <test_likely+0x2d>

  1. je:这是条件跳转指令的一部分,代表“Jump if Equal”。当之前的指令(即test %eax,%eax)的结果为0时,即EAX寄存器的值等于0,该跳转会被执行。
  2. 2d:这代表一个标签地址,它是一个特定的内存地址,通常在汇编代码中用作标记点。在这个例子中,2d是标签的偏移量。
  3. <test_likely+0x2d>:这表示相对于test_likely标签的偏移量。汇编器或链接器在最终的二进制文件中找到test_likely标签的位置,然后加上0x2d(这是一个十六进制数,等于45的十进制数),以确定跳转的目标地址。

综合来看,这条指令的意思是:“如果EAX的值等于0,则跳转到地址test_likely+0x2d处执行。”这通常用于实现条件分支,例如在C语言中的if (x == 0) { ... }结构。

这篇关于博客摘录「 性能优化:__builtin_expect详解」2024年1月15日的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/612348

相关文章

SpringIoC与SpringDI详解

《SpringIoC与SpringDI详解》本文介绍了Spring框架中的IoC(控制反转)和DI(依赖注入)概念,以及如何在Spring中使用这些概念来管理对象和依赖关系,感兴趣的朋友一起看看吧... 目录一、IoC与DI1.1 IoC1.2 DI二、IoC与DI的使用三、IoC详解3.1 Bean的存储

Spring Cloud之注册中心Nacos的使用详解

《SpringCloud之注册中心Nacos的使用详解》本文介绍SpringCloudAlibaba中的Nacos组件,对比了Nacos与Eureka的区别,展示了如何在项目中引入SpringClo... 目录Naacos服务注册/服务发现引⼊Spring Cloud Alibaba依赖引入Naco编程s依

C语言中的浮点数存储详解

《C语言中的浮点数存储详解》:本文主要介绍C语言中的浮点数存储详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、首先明确一个概念2、接下来,讲解C语言中浮点型数存储的规则2.1、可以将上述公式分为两部分来看2.2、问:十进制小数0.5该如何存储?2.3 浮点

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架

Golang中拼接字符串的6种方式性能对比

《Golang中拼接字符串的6种方式性能对比》golang的string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去,主要有6种拼接方式,下面小编就来为大家详细讲讲吧... 目录拼接方式介绍性能对比测试代码测试结果源码分析golang的string类型是不可修改的,对于拼接字

MySQL中COALESCE函数示例详解

《MySQL中COALESCE函数示例详解》COALESCE是一个功能强大且常用的SQL函数,主要用来处理NULL值和实现灵活的值选择策略,能够使查询逻辑更清晰、简洁,:本文主要介绍MySQL中C... 目录语法示例1. 替换 NULL 值2. 用于字段默认值3. 多列优先级4. 结合聚合函数注意事项总结C

Java实现数据库图片上传功能详解

《Java实现数据库图片上传功能详解》这篇文章主要为大家详细介绍了如何使用Java实现数据库图片上传功能,包含从数据库拿图片传递前端渲染,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、数据库搭建&nbsChina编程p; 3、后端实现将图片存储进数据库4、后端实现从数据库取出图片给前端5、前端拿到

Windows命令之tasklist命令用法详解(Windows查看进程)

《Windows命令之tasklist命令用法详解(Windows查看进程)》tasklist命令显示本地计算机或远程计算机上当前正在运行的进程列表,命令结合筛选器一起使用,可以按照我们的需求进行过滤... 目录命令帮助1、基本使用2、执行原理2.1、tasklist命令无法使用3、筛选器3.1、根据PID

MySql中的数据库连接池详解

《MySql中的数据库连接池详解》:本文主要介绍MySql中的数据库连接池方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql数据库连接池1、概念2、为什么会出现数据库连接池3、原理4、数据库连接池的提供商5、DataSource数据源6、DBCP7、C

Spring-AOP-ProceedingJoinPoint的使用详解

《Spring-AOP-ProceedingJoinPoint的使用详解》:本文主要介绍Spring-AOP-ProceedingJoinPoint的使用方式,具有很好的参考价值,希望对大家有所帮... 目录ProceedingJoinPoijsnt简介获取环绕通知方法的相关信息1.proceed()2.g