首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

小小的 likely 背后却大有玄机!

大家好,我是飞哥! 今天我给大家分享一个内核中常用的提升性能的小技巧。理解了它对你一定大有好处。 在内核中很多地方都充斥着 likely、unlikely 这一对儿函数的使用。...,我也没弄懂这一对儿函数的玄机。...后来才搞懂它原来对性能提升是有帮助的。今天我就来和大家聊聊 likely、unlikely 是如何帮助性能提升的。 1. likely 和 unlikely 咱们先来挖挖这对儿函数的底层实现。...__builtin_expect 这个指令是 gcc 引入的。该函数作用是允许程序员将最有可能执行的分支告诉编译器,来辅助系统进行分支预测。...意思是:EXP == N的概率很大。那么上面 likely 和 unlikely 这两句的具体含义就是: __builtin_expect(!!

84710
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    美团 EasyReact 源码剖析:图论与响应式编程

    官方资料: 美团客户端响应式框架 EasyReact 开源啦 EasyReact GitHub 只需要大致看一下官方的介绍,就很容易理解到图论在响应式编程中扮演的角色,不管如何复杂的响应链都能通过有向有环图来表示...当然,有可能数据流动会无限循环,但这属于业务工程师“指定”的逻辑。 值得注意的是,情况二的分析是建立在同一线程的。...这确实是一个非常巧妙且令人兴奋的技巧。 四、边的变换 EZRTransform有很多衍生类,每一个都对应一种变换。什么叫变换呢?...时,交由处理器将所有边的值相加,然后继续发送。...答案就是分支预测,通过工程师对业务的理解,告知编译器哪个分支概率更大,比如: if (__builtin_expect(someValue, NO)) { //为真代码 } else {

    60530

    bthread源码剖析(一): 基本概念与TaskControl初始化

    熟悉Go语言的朋友,应该对goroutine并不陌生,它也是M:N的。...TaskControl 先看TC是如何被创建的,TC对象的直接创建(new和初始化)是在get_or_new_task_control()中,这个函数顾名思义,就是获取TC,有则返之,无则造之。...下面展示一下get_or_new_task_control的被调用链(表示函数的被调用关系),也就能更直观的发现TC是如何被创建的。...= g) { fun2(); } else { fun1(); } 这两种写法有区别么?答案是有。具体哪些写法的性能相对高一些,和g 与 NULL的概率有关。...但是若要程序员如此费心的编排if else,那可就太累了。因此__builtin_expect()应运而生,其作用是"允许程序员将最有可能执行的分支告诉编译器"。

    1.3K41

    Operating System 14 - 分支预测分析

    分支预测 流水线能够在同一个时钟周期处理多个步骤的充分条件是: 每个步骤相互独立, 不存在依赖关系. 指令流水时, 处理器遇到分支指令, 不能在开始阶段就判断出分支结果, 即控制冒险(分支冒险)....动态预测: 会根据执行指令的不同, 依据program counter(PC)的值以及历史信息等做出不同的预测(有状态)....地址指地址空间前后, 主要场景是每当到了一个循环的末尾判断是否继续循环时会预测向前跳转继续循环(Predict that all backward branches (toward lower addresses...动态预测: Strategy 2: 做出和上次是否跳转一样的预测, 默认跳转(Predict that a branch will be decided the same way as it was on...分析: 任务耗时, IPC和分支预测成功率近似相等, 说明有无__builtin_expect内置函数对性能无明显影响.

    93830

    OC底层探索03-常用的alloc,init,new到底做了什么?OC底层探索03-常用的alloc,init,new到底做了什么?

    推断:内存空间是由alloc负责申请,从这个角度看init并没处理任何动作 对象是存放在堆区; 对象的指针存放在栈区 对象的存储位置 用一张图来解释: ?...alloc alloc 想要一探alloc是如何申请了内存空间的,就需要使用上篇中提到的objc源码了。...废话不多说,打开源码,加上断点,一步步开始调试: 此处有两种可能,简述流程省略代码: 创建NSObjec 直接进入alloc流程 创建继承自NSObject的自定义类 先进入_objc_alloc...fastpath、slowpath 在源码中反复出现的这两个宏定义,我觉得有必要简单解释一下: //x很可能为真, fastpath 可以简称为 真值判断 #define fastpath(x) (_...(x), 0)) 来源:__builtin_expect命令是由gcc引入的 目的:提醒编译器可以对此处代码进行编译优化,以减少指令跳转带来的性能消耗 作用:在编译过程中就允许程序员将最有可能执行到的代码分支告诉编译器

    80540

    Android智能指针

    这里面有一个问题:它如何知道我们不用了?智能指针的解决方案是维护一个计数器。在合适的时候增加计数器(构造函数),在合适的时候减少计数器(析构函数)。...ldrex指令的作用是把指针ptr指向的内容放到prev变量中,同时给执行处理器做一个标记(tag),标记上指针ptr的地址,表示这个内存地址已经有一个CPU正在访问。...当执行到strex指令时,它会检查是否存在ptr的地址标记,如果标记存在,strex指令会把add指令执行的的结果写入指针ptr指向的地址,并且返回0,然后清除该标记。...__builtin_expect是gcc的内建函数,有两个参数,第一个参数是一个表达式,第二个参数是一个值。表达式的计算结果也是函数的结果。...__builtin_expect是用来告诉gcc预测表达式更可能的值是什么,这样gcc会根据预测值来优化代码。代码中表达的含义是预测“status!

    62440

    Objective-C内存管理原理探究(一)

    前言 相信每个人在开发iOS的过程中都有过OC是如何管理内存的疑问,虽然大家都知道是基于引用计数的,但retain,release究竟做了什么,只是简单的将引用计数加减1吗?...1; 3.对象关联的某个指针不再指向他时,他的引用计数就减1; 4.对象的引用计数为0时,说明此对象不再被任何指针指向,这时我们就可以将对象销毁。..._builtin_expect(bool(x), 0)) __builtin_expect起的是优化性能的作用 __builtin_expect((x),1) 表示 x 的值为真的可能性更大; _...3、判断是否支持hasCxxCtor 和 hasCxxDtor还有canAllocNonpointer,hasCxxCtor 和 hasCxxDtor是对 Objective-C++ 的支持,表示这个类是否有...TaggedPointer,之后对 isa 中是否有自定义 retain 和 release,如果没有自定义的实现,则进入sidetable_retain 函数,否则的话直接向对象发送 retain 消息

    1.1K100

    MySQL执行流程

    理解mysql整个执行流程,对sql调优是有帮助的,我们先看一张流程图MySQL主要分为server层与引擎层server层:连接器,查询缓存,解析器,预处理器,优化器等,所有跨存储引擎的功能都在这一层实现...有一点需要注意,MySQL并不是会因为查询中包含一个不确定的函数而不检查查询缓存,因为检查查询缓存之前,MySQL不会解析查询语句,所以也无法知道语句中是否有不确定的函数**。...事实则是,如果查询语句中包含任何的不确定的函数,那么其查询结果不会被缓存,因为查询缓存中也无法找到对应的缓存结果。...这个数据结构我 们把它叫做解析树。解析树图:预处理器经过词法语法分析之后,如何保证sql语句中的表,字段是否存在呢?预处理器就是做这件事情的。预处理器也是在解析环节,预处理之后得到一个新的解析树。...一条查询可以有多种执行方法,最后都是返回相同结果。优化器的作用就是找到这其中最好的执行计划。

    10910

    LLVM编译器中的内置(built-in)函数

    ,其作用类似于宏。...因为执行这些函数调用会在编译时变为直接指令块的执行,而不会产生指令跳转、堆栈等相关的操作而引起的函数调用开销(有一些函数直接就有一条对应的机器指令来实现,如果改用普通函数调用势必性能大打折扣)。...iOS系统中用ARC进行内存管理时对返回值是OC对象的函数和方法的特殊处理。...参数为调用函数的层级,从0开始并且只能是一个常数。这个函数可以用来实现防止栈内存溢出的栈保护处理。因为调用函数内定义的任何的局部变量的地址都必须要小于这个地址值。...fooFor(10); fooFor(10.0); __builtin_expect() 这个函数的主要作用是进行条件分支预测。

    2.7K30

    一文看懂DPDK

    传统的电信领域 IP层及以下,例如路由器、交换机、防火墙、基站等设备都是采用硬件解决方案。基于专用网络处理器(NP),有基于FPGA,更有基于ASIC的。...但是软件开发却无法跟上节奏,单机处理能力没能和硬件门当户对,如何开发出与时并进高吞吐量的服务,单机百万千万并发能力。...我们要控制Cache的命中率,我们要了解计算机体系结构,不能发生跨Node通讯。 从这些数据,我希望可以直接感受一下这里的挑战有多大,理想和现实,我们需要从中平衡。...比如C++11引入了constexp,比如可以使用GCC的__builtin_constant_p来判断值是否常量,然后对常量进行编译时得出结果。...七、DPDK生态 对我们互联网后台开发来说DPDK框架本身提供的能力还是比较裸的,比如要使用DPDK就必须实现ARP、IP层这些基础功能,有一定上手难度。

    65.2K3439

    C++ 动态新闻推送 第64期

    rhs.value_); has_value_ = true; } else { // nothing } return *this; } 但如果是简单类型,这未免太杀鸡牛刀...= 0) << 4; unsigned r; if (a > 65535) r = 16; else r = 0; __builtin_expect 对编译器来说帮助不大,用这个是优化pipeline...的,要知道你的业务场景 Gcc 9加了个__builtin_expect_with_probability 比 __builtin_expect更准点 RFC: Improving Clang’s Diagnostics...原来是个咨询公司啊 这怎么能赚到钱的。 我对国外很多软件的咨询赚钱模式感到不可思议。国内根本没有这个环境。归根到底是国内人才太多了?...不过c++有个is_sorted接口, 另外用 adjacent_find也是可以的 My take on “where’s all the code” 作者写了个c版的工具,输出代码目录的各种数据(

    37530

    科学家从理论计算机出发,提出了一个意识模型——「有意识的图灵机」

    SEAs在处理器是否将它们的块放入STM方面起作用。SEAs也对处理器是否会「注意」那些通过链接发送给它们的块中的要点有影响。...2) 架构 这包括获得STM访问权的上行树竞争,以及随后对赢家所进行的全局的下行树广播,尤其是所有在产生意识感觉中扮演特殊角色的处理器。 3) 特殊的处理器。...这些处理器通知CTM世界模型中的「眼睛」和「皮肤」,让它们「看到」CTM从视觉记忆中回忆起来的任何东西,并「有触觉地感知」CTM从感官记忆中回忆起的任何东西。...作者相信从模型中得出的解释,提供了对意识体验如何产生或者可能如何产生的高层次理解,这些解释与心理学和神经科学文献达成了高度一致。...正是有了那些经过选择的知识(CTM对选择有了解、也有不理解之处),CTM才生成了自由意识的感觉。不管确定性与否,这种经验上的感觉是自由意志的一种。 随机性对于这种自由意志感觉的解释有多重要?

    81610

    能感知功耗的Linux调度器(EAS)

    EAS到底是有什么了不起,以及我们如何应用它?在解释之前,我们需要讨论Linux调度器。 Linux调度器的演变 轮转调度 ?...这很不好,因为低功耗核可能被迫运行密集的应用程序,或者更糟的是发生相反的情况(译者注:即一段时间内高功耗核运行的应用程序非常少,对高功耗核是一种浪费)。...OnePlus 6的可调参数能在低功耗核上设置任务的优先级,可是这并不起什么作用。而 Google Pixel 2具有巨大的输入提升能力,所有8个核始终保持在线状态。...我要特别感谢XDA公认的贡献者Mostafa Wael, 他对EAS各个方面的解释极大地帮助了本文的实现。...那些对EAS相关内容感兴趣的人,Linaro有很多关于EAS的文档,您可以阅读。

    3.7K50

    初学者也能看懂的DPDK解析

    传统的电信领域 IP层及以下,例如路由器、交换机、防火墙、基站等设备都是采用硬件解决方案。基于专用网络处理器(NP),有基于FPGA,更有基于ASIC的。...但是软件开发却无法跟上节奏,单机处理能力没能和硬件门当户对,如何开发出与时并进高吞吐量的服务,单机百万千万并发能力。...我们要控制Cache的命中率,我们要了解计算机体系结构,不能发生跨Node通讯。 从这些数据,我希望可以直接感受一下这里的挑战有多大,理想和现实,我们需要从中平衡。...比如C++11引入了constexp,比如可以使用GCC的__builtin_constant_p来判断值是否常量,然后对常量进行编译时得出结果。...七、DPDK生态 对我们互联网后台开发来说DPDK框架本身提供的能力还是比较裸的,比如要使用DPDK就必须实现ARP、IP层这些基础功能,有一定上手难度。

    2.3K21

    【译】硬件内存模型 Hardware Memory Models

    “视情况而定” 这似乎不是一个令人愉快的结局,程序员需要一个明确的答案来确定一个程序是否能在新的硬件或新的编译器下继续工作,同时硬件设计师和编译器开发者也需要一个明确的答案来确定在执行一个给定的程序时,...本地写队列是一个标准的先进先出的队列:内存写操作将会根据处理器执行他们的顺序作用于共享内存,因为写操作的顺序由写队列保存,而且由于其他处理器可以立刻看倒对共享内存的写操作,所以前面我们考虑的 Litmus...粗略来说,(内存模型)这意味着从系统中任何一个处理器产生的事件的顺序,对在其他处理器上的观察者来说,始终是相同的。但是,允许观察者对来自两个或多个处理器的事件持不同意见。...答案似乎是英特尔处理器从未对这个 Litmus 测试做出 yes 的回答,而当时这位英特尔的架构师也不愿意尾未来的处理器做出任何保证。...在这里,模型和现实之间的分歧开始发挥作用,正如我们在英特尔 x86 中所做的那样:硬件实现了比技术上的保证更强的模型,我们鼓励(程序)依赖于更强的行为,这代表着将来,较弱的硬件将会会破坏程序行为,不管其是否有效

    1.2K20

    上下文变量值(context values)陷阱及在 Go 中如何避免或缓和这些陷阱

    相反,这些替代方案仍然很粗糙,像“自定义 structs” 或 “闭包(closures)”的方案并没有深入研究他们在复杂的应用中如何实现,或对中间件的可重用性可能如何影响。...这看起来并不糟糕,但是如果我们想要在处理器中进行四或五种不同的中间处理的时候会怎样呢?就像生成一个唯一的请求 ID,创建一个日志接收器利用这个请求 ID,验证用户是否登陆,验证用户是否是管理员?...你可能利用这种方法写出了通用型代码,但是也有一个值得思考的问题。我们处于某种原因在函数中使用显式类型参数,因此任何时候我们选择放弃放弃一些信息,这些信息可能值得考虑是否有那么大的收益。...函数需要的数据被隐藏了 当使用上下文变量的时候,我最大的关切是难以确定函数需要处理的数据。...这最终看起来像某些类似于 “闭包和自定义函数说明” 的部分,但是我们有一个定义好的中等大小的上下文,将其传递给每个处理器。

    1.7K30

    我为css变量狂 - 腾讯ISUX

    快速的扫了一遍之后,发现99%人抱怨的无外乎这两点: 语法太丑和不够简洁 Sass 、Less早就有这些玩意了,不太care 虽然我承认我也对这语法很反感,更重要的是理解语法不只是反复无常的在选择。...CSS工作组讨论很久语法的长度,他们提取了一些点,考虑到CSS的语法兼容不会与未来增加的其他语言冲突。 CSS 预处理器是一个非常出色的工具,但是它们的变量是静态的,有语法作用域。...预处理器做了一件非常了不起的事情,即时你知道他最终出来的就是原始的CSS,任然可以感受这个神器的时代。 任何工具,都有他的局限性,有一个炫酷的外观会让人惊喜而忽略了其中的限制,特别是新用户。...为了更简洁,预处理器变量是语法作用域和编译后静态。自定义属性作用域是DOM,他们都很灵活。 实际案例 如果你仍然不确定自定义属性可以做到这一点,而预处理器不行,我这里给一些例子。...另外,自定义属性,按钮组件仍是没有语境且不能完全与header 组件解耦, 按钮组件简单的说申明:无论它们现状如何,我要自己的风格基于这些自定义属性; header 组件:我要设置这些属性值,由我的子代来确定和如何使用它们

    68530
    领券