网易首页 > 网易号 > 正文 申请入驻

谷歌工程师实测:1行代码让CPU少等15个周期,C++20这功能藏了4年

0
分享至

2019年C++20标准定稿时,有个功能被塞进草案角落,直到2023年才被大规模编译器支持。现在谷歌、Meta的底层代码开始批量替换,性能提升幅度用他们的话说——"像白捡的"。

这个功能叫分支预测提示(Branch Prediction Hints)。简单说:告诉CPU"这条if语句大概率走左边",CPU就能提前把左边代码塞进流水线。猜对了零成本,猜错一次罚15-20个周期。在每秒执行百万次的循环里,这个差距能把响应时间从毫秒级拉到微秒级。

CPU在跟你玩猜谜游戏,而且赌注很高

现代CPU的流水线像一条高速传送带。当前指令还在执行时,后10条已经在解码、取指、预加载了。但遇到if/else分支,传送带突然断了——CPU不知道往哪边走。

它只能猜。猜对了,流水线满速运转。猜错了,前面做的全部作废,清空流水线重新来。一次失误的代价,够执行20条普通指令。

编译器其实能帮CPU提高胜率,但前提是你得告诉它哪条路更"热"。这就是分支预测提示的本质:把程序员的领域知识,翻译成CPU能用的下注策略。

2020年前,这件事靠GCC的__builtin_expect完成,写法丑陋到需要宏包装。Linux内核为此定义了LIKELY/UNLIKELY宏,用了二十年。C++20终于给了标准答案:[[likely]]和[[unlikely]]属性。

[[likely]]的隐藏收益:不只是猜对那么简单

很多人以为这个属性只是给CPU的提示,其实编译器拿到信息后,会重新排列机器码的布局。

被标记[[likely]]的分支会成为"直通路径"(fall-through),不需要跳转指令。这不仅省了一个周期,更重要的是保护了指令缓存的局部性。

跳转指令会把执行流扯到内存别处,CPU的指令缓存(L1-I)可能没准备好,触发缓存未命中。而直通路径的指令是连续的,预取单元能完美配合。

来看具体写法。C++20允许把属性直接贴在语句上:

if (error_code != 0) [[unlikely]] {

// 错误处理,极少触发

} else [[likely]] {

// 主路径,机器码连续排列

switch语句同样支持:

switch (packet_type) {

[[likely]] case PacketType::Data: // 数据包占99%流量

process_data();

break;

[[unlikely]] case PacketType::Error: // 错误包极少

log_error();

break;

GCC和Clang从版本10开始完整支持,MSVC要到2022年才跟上。这也是功能"藏了4年"的原因——编译器生态的滞后比标准定稿更慢。

__builtin_expect: legacy代码库的迁移陷阱

如果你维护的是2019年前的代码,大概率见过这种写法:

if (__builtin_expect(ptr != nullptr, 1)) {

// 期望为真

第二个参数1表示"期望表达式结果为真",0则相反。这个设计反直觉到极点——为什么不用LIKELY/UNLIKELY这种自解释的宏?

历史原因。GCC 2.95时代引入这个内置函数时,C还没有标准化属性语法。它只能做成函数调用的样子,让编译器在AST阶段识别并优化。

迁移到C++20时有个细节陷阱:__builtin_expect的返回值是long,而[[likely]]直接修饰语句。混合使用可能导致微妙的语义差异,特别是在复杂表达式中。谷歌的Abseil库为此做了专门兼容层,根据__cplusplus版本自动选择实现。

一个实测案例:TensorFlow的内存分配器在热点路径添加[[likely]]后,分支预测失误率从12%降到0.3%,单线程吞吐量提升8%。考虑到这是被调用数十亿次的函数,累积收益相当可观。

编译器标志:比属性更暴力的控制手段

属性是细粒度工具,编译器标志则是全局开关。GCC和Clang提供-fprofile-generate/-fprofile-use组合,让编译器基于真实运行数据重新优化分支布局。

流程分两步:先用插桩版程序收集分支频率,再用数据指导第二次编译。这属于"基于剖面的优化"(Profile-Guided Optimization,PGO),效果通常比人工提示更准,但构建流程复杂得多。

更轻量的选择是-fpredictive-commoning,让编译器自动识别循环内的公共表达式。还有-freorder-blocks-and-partition,专门优化跳转指令的排列。

这些标志和[[likely]]不冲突。PGO提供数据驱动的全局优化,属性保留人工干预的精确性。Meta的HHVM编译器团队采用混合策略:PGO处理90%的代码,剩余10%的热点路径用手工属性微调。

什么时候不该用:提示滥用的代价

分支预测提示有个危险特性:猜错时的惩罚比不提示更高。CPU会优先信任你的提示,一旦实际运行模式与预期不符,流水线清空的代价完全由你承担。

典型反例是网络协议解析。你以为Data包占99%,但遇到DDoS攻击时Error包瞬间暴涨。硬编码的[[likely]]反而拖慢异常处理,放大攻击效果。

另一个陷阱是编译器版本差异。Clang对[[unlikely]]的处理比GCC更激进,某些场景下会完全删除unlikely分支的代码(认为它"足够冷"可以outline)。如果实际触发了,触发昂贵的函数调用开销。

谷歌性能团队的建议是:先用perf或VTune确认分支预测失误确实是瓶颈,再针对性添加提示。盲目标注会让代码更难维护,且收益递减。

从C++23看向未来:静态分析介入

C++23没有新增分支预测语法,但标准化了std::assume,允许更激进的优化契约:

if (x > 0) {

std::assume(x != INT_MAX); // 编译器可据此优化

这不同于[[likely]]——assume是承诺而非提示,如果违反属于未定义行为。它给编译器的优化空间更大,风险也更高。

更长远看,LLVM社区在探索"机器学习指导的编译优化"。用神经网络预测分支概率,替代人工标注。2023年Google Research的论文显示,在SPEC CPU2017测试集上,ML模型比静态启发式减少11%的分支失误。

但模型训练需要大量运行时数据,和PGO面临同样的部署难题。短期内,[[likely]]这类轻量级提示仍是工程实践的主流选择。

最后留个细节:Chromium源码里搜索[[likely]],会发现它只出现在base/和net/等底层库,业务代码几乎不用。不是不需要,而是性能敏感层的改动需要严格的基准测试覆盖。一个错误的提示,可能让渲染引擎在特定网页上卡顿10毫秒——用户能感知到的阈值。

你的代码库里,有多少if语句的冷热分布是凭直觉写的?

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
河南知名景区,一游客持大刀互动砸到演员头部,演员回应:是不小心误伤,打了破伤风针已恢复演出

河南知名景区,一游客持大刀互动砸到演员头部,演员回应:是不小心误伤,打了破伤风针已恢复演出

环球网资讯
2026-04-12 09:10:48
医生直言:体检报告这5项指标正常,身体基本上无大碍,建议了解

医生直言:体检报告这5项指标正常,身体基本上无大碍,建议了解

熊猫医学社
2026-04-03 11:35:03
美国总统特朗普: 封锁伊朗后美国将能大卖石油

美国总统特朗普: 封锁伊朗后美国将能大卖石油

财联社
2026-04-13 13:46:08
2026有线电视全面整改!这些收费全取消,再也别花冤枉钱!

2026有线电视全面整改!这些收费全取消,再也别花冤枉钱!

时尚的弄潮
2026-04-13 14:36:32
郑丽文的婚姻:女主外男主内,不生育孩子,事业理想置于家庭之上

郑丽文的婚姻:女主外男主内,不生育孩子,事业理想置于家庭之上

芳芳历史烩
2026-04-08 16:28:15
终究还是落槌了。 内塔尼亚胡,这位在政坛翻云覆雨几十载的硬汉

终究还是落槌了。 内塔尼亚胡,这位在政坛翻云覆雨几十载的硬汉

网络易不易
2026-04-13 11:03:04
22球18助!英媒:亚马尔已是足坛世界第1 超越同龄梅西C罗

22球18助!英媒:亚马尔已是足坛世界第1 超越同龄梅西C罗

叶青足球世界
2026-04-12 20:06:57
上海交大发现:不吃酱油和味精的人,血压马上就降低了?真的吗?

上海交大发现:不吃酱油和味精的人,血压马上就降低了?真的吗?

健康之光
2026-04-13 15:10:03
看金门如何融入厦门,解放台湾岛并不一定非得通过战争

看金门如何融入厦门,解放台湾岛并不一定非得通过战争

聆泉书斋
2026-04-05 23:11:16
以色列摩萨德局长换人,为白俄罗斯裔犹太人,任内塔尼亚胡军事秘书,总理办公室称他“极具声望”,批评者称他缺乏情报工作经验

以色列摩萨德局长换人,为白俄罗斯裔犹太人,任内塔尼亚胡军事秘书,总理办公室称他“极具声望”,批评者称他缺乏情报工作经验

极目新闻
2026-04-13 10:55:21
不踢球却统治足球!美国资本血洗欧洲足坛:百年规则,我说改就改

不踢球却统治足球!美国资本血洗欧洲足坛:百年规则,我说改就改

曾蠃爱旅行
2026-04-13 07:40:22
全红婵事件最新!嫌疑人被抓,央视曝处罚结果,牵连人员真相大白

全红婵事件最新!嫌疑人被抓,央视曝处罚结果,牵连人员真相大白

朗威谈星座
2026-04-13 09:06:11
案例:北大女博士倒挂长城2个小时,目睹老公劈死,自己坠崖而亡

案例:北大女博士倒挂长城2个小时,目睹老公劈死,自己坠崖而亡

清茶浅谈
2025-01-14 18:01:31
朝鲜战争期间:美军原来已接近击败中国,却碰上中国决死的指挥官

朝鲜战争期间:美军原来已接近击败中国,却碰上中国决死的指挥官

最美的巧合
2026-04-12 10:36:36
42岁文章开饭店!亲自迎客端菜,微笑热情

42岁文章开饭店!亲自迎客端菜,微笑热情

三言科技
2026-04-13 09:47:12
特朗普紧急下令,美军即将行动,以色列深夜开火,伊朗要小心了

特朗普紧急下令,美军即将行动,以色列深夜开火,伊朗要小心了

南宗历史
2026-04-13 14:56:39
沙特能源大动脉迅速“止血”:东西向输油管道恢复满负荷运行

沙特能源大动脉迅速“止血”:东西向输油管道恢复满负荷运行

财联社
2026-04-13 12:50:10
宇航员从太空回望地球,为什么会感到恐惧,他们看到了什么?

宇航员从太空回望地球,为什么会感到恐惧,他们看到了什么?

观察宇宙
2026-04-13 09:28:52
白人女性与黑人女性的体味差异,网友真实分享引发热议

白人女性与黑人女性的体味差异,网友真实分享引发热议

特约前排观众
2025-12-22 00:20:06
项立刚微博被禁言,易中天获厦大杰出贡献奖

项立刚微博被禁言,易中天获厦大杰出贡献奖

难得君
2026-04-09 16:02:49
2026-04-13 15:52:49
赛博兰博
赛博兰博
专注捣鼓AI效率工具,试图在这个时代留下数字分身的探索者。
1330文章数 15关注度
往期回顾 全部

科技要闻

传荣耀与字节跳动接洽“豆包手机”合作

头条要闻

女子名下多出一套上海房产很苦恼:丈夫去世 房子没了

头条要闻

女子名下多出一套上海房产很苦恼:丈夫去世 房子没了

体育要闻

一支球队不够烂,也是一种悲哀

娱乐要闻

贾玲减重后现身冯巩生日宴 身材未反弹

财经要闻

起底AI"造黄"灰产:19.9元"一键脱衣"

汽车要闻

不止命名更纯粹 领克10/10+要做纯电操控新王

态度原创

游戏
亲子
数码
旅游
公开课

《生化9》里昂雕像引热议:半裸舔腋下 玩家吵翻天!

亲子要闻

郭碧婷传授备孕经验,二胎顺转剖后,整个人废了,尤其是肢体上

数码要闻

高管亲自放风 何刚暗示华为 WATCH FIT 5 Pro即将发布

旅游要闻

洛阳国际牡丹园“混血”黑牡丹——水墨丹青迎来最佳观赏期

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版