news 2026/7/13 20:14:22

同事用“与运算“改了这几行代码,运行效率直接起飞~

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
同事用“与运算“改了这几行代码,运行效率直接起飞~


正文


大家好,我是bug菌~

1

问题背景

最近由于项目指标的需求,查了下程序各个部分的运行效率,发现一直用的环形缓冲区在耗时占比中还挺突出,于是过了一遍代码并尝试着去优化一下,没想到改动不大却得到了较大的效率提升。

如下是之前环形缓冲区的一些代码片段:

#define BUFFER_SIZE 512 uint16_t buffer[BUFFER_SIZE]; uint16_t index = 0; ...... index = (index + 1) % BUFFER_SIZE; ......

当程序高频率的调用含有取模的运算接口时执行时间超出了设计预期,同时在低优化等级(毕竟如果编译器进行了各种优化,那就不好聊下去了)下对取模运算进行了相关sysclock的测量,确实也是效率不高,于是我打算用更高效的运算方式把它替换掉。

2

与运算代替取模

当然了,与运算至少全面替代取模运算没那么容易,毕竟如果能够完全替代,也不会有人用取模了,当时对于嵌入式行业我觉得最有意思的是它并不需要非常的通用,嵌入式只需要在特定的领域,特定的工况下能做到极致就可以了,有取舍才能在有限的资源下把平台充分利用起来。

同样的思路取模运算确实很强大,但是我并不需要利用它所覆盖的方方面面,所以当除数是2的幂(即n = 2^k)时,与运算同样可以满足我的需求:

// 当 n 是 2 的幂(n = 2^k)时 a % n = a & (n - 1) // 等价的情况(n是2的幂) a % 8 == a & 7 // 8 = 2^3 a % 16 == a & 15 // 16 = 2^4 a % 32 == a & 31 // 32 = 2^5

我们知道% 运算通常需要除法指令,开销较大,而& 运算只需要按位与,速度快很多。

所以对应环形缓存区只需要优化下:

#define BUFFER_SIZE 512 // 必须为2的幂 #define BUFFER_MASK (BUFFER_SIZE - 1) // 511 = 0x1FF uint16_t buffer[BUFFER_SIZE]; uint16_t index = 0; ...... index = (index + 1) & BUFFER_MASK; // 快速回绕 ......

3

再细致一点

聊到这里,来龙去脉应该讲清楚了,其实不管了是在这一次的环形缓存区的优化中有所感悟这种方法,只要是在当除数是2的幂时这种方式都能大大提高效率,特别是一些实时性应用场景,一通百通。

比如说你要进行ADC窗口滑动:

samples[sample_index] = adc_read(); ...... // sample_index = (sample_index + 1) % WINDOW_SIZE; //直接方式 sample_index = (sample_index + 1) & WINDOW_MASK; ......

一些限制和风险我们也要非常有数,一些bug大部分都是因为我们没有提前想到:

1、在性能关键路径且除数是2的幂时,才考虑使用与运算替代取模运算,其他地方其实无关痛痒也没必要替换,所以可以做一些防御性检测:

#ifndef IS_POWER_OF_TWO #define IS_POWER_OF_TWO(x) (((x) & ((x) - 1)) == 0) #endif #define QUEUE_SIZE 128 #if !IS_POWER_OF_TWO(QUEUE_SIZE) #error "QUEUE_SIZE must be power of two for optimization" #endif #define QUEUE_MASK (QUEUE_SIZE - 1)

2、如果是处理负数大概率会出问题,要留意。

最后

好了,今天就跟大家分享这么多了,如果你觉得有所收获,一定记得点个~

唯一、永久、免费嵌入式技术知识分享平台

推荐专辑 点击蓝色字体即可跳转

MCU进阶专辑

嵌入式C语言进阶专辑

“bug说”专辑

专辑|Linux应用程序编程大全

专辑|学点网络知识

专辑|手撕C语言

专辑|手撕C++语言

专辑|经验分享

专辑|电能控制技术

专辑 | 从单片机到Linux

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/13 6:22:01

卫星通信-145页.pptx

关注、星标公众号,精彩内容每日送达 来源:网络素材(全文完)声明:我们尊重原创,也注重分享;文字、图片版权归原作者所有。转载目的在于分享更多信息,不代表本号立场,如有侵…

作者头像 李华
网站建设 2026/7/13 12:03:16

(3-1)机器人身体结构与人体仿生学:人体生物力学与关节分析

本章内容围绕人形机器人身体结构与人体仿生学展开,系统分析了人体生物力学特征及其对机器人结构设计的指导意义。首先从关节自由度、运动范围与扭矩需求入手,结合力臂与质量分布,阐明人体动态平衡的力学基础;随后重点介绍了人形机…

作者头像 李华
网站建设 2026/6/26 12:36:31

多商户+多端一体化:商城系统的核心功能架构与源码实现

温馨提示:文末有资源获取方式寻找一款既能自主创业,又能开启技术服务业务的电商系统?您的需求,现在有了完美的答案。我们为您带来一款经过重磅升级、功能堪称豪华的多端多商户商城源码,它专为有远见的创业者与开发者设…

作者头像 李华
网站建设 2026/6/26 12:36:38

写论文软件哪个好?实测封神!虎贲等考 AI 凭全流程硬核实力 C 位出圈

还在为毕业论文熬秃脑袋?选题迷茫、文献堆砌、查重超标、AI 痕迹明显,每一个环节都让人焦头烂额。市面上的论文软件五花八门,有的只懂降重,有的只会生成文字,真正能一站式搞定论文全流程的少之又少。作为深耕论文写作科…

作者头像 李华
网站建设 2026/7/4 22:38:27

2026最新PotPlayer下载安装使用教程:轻量高效的视频播放器全面解析

前言 在各类视频播放软件中,PotPlayer长期以轻量、高性能和兼容性强著称,深受视频剪辑师、影视爱好者以及技术用户青睐。它不仅可以播放主流格式视频,还支持高清、蓝光乃至4K影片的流畅播放。如果你正在寻找一款稳定又功能强大的播放器&…

作者头像 李华