<span class=“js_title_inner“>同事用“与运算“改了这几行代码,运行效率直接起飞~</span> 📅 发布时间:2026/7/11 1:44:28 👁️ 浏览次数: 正文大家好我是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
基于multisim的简易波形发生器的设计 (1)输出3路波形(正弦波、方波和三角波); (2)信号频率 200Hz; (3)信号幅度范围 4-6V(3种波形的幅度可以一样,也可以不一样,范围在 4-6V内 即可) (4)利用 Multisim 仿真软件完成电路的设计、参数调整和测试。 仿真图 仿真演示与文件下载:基于m… 2026/7/8 7:48:39
2026 网络安全行业深度解析:前景、入行路径与系统学习指南 2026 网络安全行业深度解析:前景、入行路径与系统学习指南 一、行业发展现状:风口上的黄金赛道 2026 年的网络安全行业已从 “被动防御” 迈入 “主动对抗” 的全新阶段,三大核心驱动力让行业持续保持高速增长。 政策层面,《网… 2026/7/11 10:59:16
Linux C/C++组件编译全解析:从源码到可执行文件的奥秘 引言:为什么需要了解文件后缀? 在Linux C/C开发中,不同文件后缀代表着不同的编译阶段和用途。作为开发者,理解这些后缀的含义不仅有助于构建系统,还能在调试和优化时提供重要线索。本文将基于QEMU项目中virtio-balloon… 2026/5/17 1:54:18
TradingAgents-CN多智能体金融分析平台:从零到一的完整部署交响曲 TradingAgents-CN多智能体金融分析平台:从零到一的完整部署交响曲 【免费下载链接】TradingAgents-CN 基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN 当金融市场数据如潮… 2026/7/11 21:34:38
密林热成像实测:穿透力、温漂与算法如何决定野外成败 1. 项目概述:为什么密林才是热成像设备的终极考场?这两年在户外圈里,热成像仪已经不是什么稀罕物件了。我从2019年开始带热成像进山做野生动物监测,最早用的是某进口品牌入门款,单机近两万,电池撑不过两小时… 2026/7/11 21:32:37
Claude Tag与Fable 5:企业级AI编程工具的技术架构与应用实践 Anthropic最近将其内部工具Claude Code进化为全公司使用的Claude Tag,并已接入最新的Fable 5模型。这一转变标志着AI辅助编程工具从内部实验走向企业级应用的重要里程碑。Claude Tag作为Claude Code的升级版本,不仅继承了原有的代码理解和生成能力&#… 2026/7/11 21:32:37
系统装好了,高拍仪等外设却“罢工”?这个老大难终于有解了 电脑换了,系统装了,结果高拍仪不识别、扫描仪连不上。这是当下很多政企单位在国产化道路中真实遭遇的困难现场。外设驱动适配不全,轻则导致业务中断,重则让项目验收遥遥无期。如何让存量外设在新系统上重新“上岗”?大… 2026/7/11 21:30:37
AI工具普及下技术变现困境与成本优化策略分析 1. 为什么AI工具越普及,技术变现反而越难?最近半年,几乎每个开发者都能感受到AI带来的效率提升。GitHub Copilot让代码补全变得智能,ChatGPT帮我们快速生成文档,Midjourney让UI设计门槛大幅降低。表面上看,… 2026/7/11 21:28:36
【Cursor AI网络请求封装终极指南】:20年全栈专家亲授5大避坑法则与3种高可用封装模式 更多请点击: https://codechina.net 第一章:Cursor AI网络请求封装的认知革命 传统网络请求封装往往陷入“重复造轮子”的泥潭:每个项目都重写 axios 实例、拦截器、错误映射与重试逻辑。Cursor AI 的出现,将这一过程升维为语义驱… 2026/7/11 21:28:36
5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 [特殊字符] 5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 🎬 【免费下载链接】zimuku_for_kodi Kodi 插件,用于从「字幕库」网站下载字幕 项目地址: https://gitcode.com/gh_mirrors/zi/zimuku_for_kodi 还记得那个深夜吗?你刚下载… 2026/7/11 0:00:11
工业信号干扰处理与FOD4216光耦应用实战 1. 工业环境中的信号干扰挑战在工业自动化领域,信号采集的准确性直接关系到整个控制系统的可靠性。典型的工业现场充斥着各种干扰源:大功率电机启停产生的电磁干扰、变频器工作产生的高频噪声、继电器触点火花放电,以及长距离传输引入的共模干… 2026/7/11 0:00:11
OpenHarmony 完整项目工程整合规范 + 模块化分层架构(API23+ 标准企业级结构) 摘要前面系列教程覆盖了 ArkUI 组件、路由、生命周期、本地存储、网络请求、Ability 底层全套基础能力,本篇统一梳理标准工程目录分层、模块化拆分、代码复用规范、全局工具统一管理、项目打包权限配置、常见工程报错统一解决方案,形成可直接用于课程设计… 2026/7/11 0:00:11
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/11 14:53:30
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/11 12:30:52
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/11 15:29:59