C++性能优化-代码角度

news2024/9/20 15:31:45

减少跳转/分支语句和函数调用

原因

  • 分支语句:当 CPU 执行到分支语句时,将会进行分支预测(对大部分PC)。如果分支预测错误,就会清空已经预取和执行的部分指令,重新从正确的分支开始取指和执行,这会导致额外的性能开销。
  • 函数调用:调用函数需要额外入栈和出栈函数的栈帧

优化

分支语句

  1. 使用算数运算或无分支算法
  2. 使用三目运算符
  3. 使用策略模式
  4. 使用表驱动

函数调用

  1. 使用inline
  2. 使用循环迭代而不是递归
  3. 必须使用时,避免传递大型对象或复杂的数据结构,使用指针或引用作为参数,尽量减少函数参数
  4. 简单函数写为define

避免频繁内存分配和释放

原因

  • 内存分配涉及到操作系统的系统调用,有较大的开销
  • 频繁地进行动态内存分配和释放容易导致堆中产生碎片化的空间
  • 动态内存分配需要使用锁来控制访问allocator。对于使用动态内存的多线程应用,添加额外处理器会导致减速;对于单线程应用,在堆上分配内存也比在栈上要开销更大

优化

  1. 使用内存池、对象池等池化技术。优化代码逻辑,减少一次性对象创建,建立对象池重用对象
  2. 静态申请,直接给一块足够大的内存空间
  3. 统一内存分配方式/对齐内存分配,避免不同大小的内存分配,可以减少内存碎片的产生

其他

二维或者更高维的数组在调用时,按行存取-->Array[i][j]Array[i][j+1]相邻

当类中需要的数据初始化时间较长时,应将对象的数据在额外的init函数初始化

大循环在内,小循环在外-->指令执行机制都会存在预处理指令的分支,预测出错的分支必然存在。因此在A套B和B套A相同时(A>>B),A在内部时错误较少。

对于一个100次的循环,除第一次和最后一次预测指令出现错误,其他预测的指令都可以预测循环体内的指令;避免了执行转移指令时重新取出新指令造成的时间浪费。

对于两个A和B两个循环,A>>B:

  • A在外,B在内,每次进行循环的时候,B都会出现两次错误,一共循环A次;A循环本身也会出现两次预测错误,所以最终得出的指令预测错误是A*2 +2 ;
  • B在外,A在内,每次循环都会出现2次预测错误,一共循环B次;B循环本身也会出现两次错误,所以,最终得出的指令预测错误是B*2 + 2;

循环嵌套问题:为什么大循环在内,小循环在外可以提高程序的运行效率_大循环放外面还是小循环放外面-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/weixin_43298884/article/details/125060728

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2149278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

某东-h5st参数逆向分析

目标:商品搜索翻页接口 直接搜索h5st就可以搜到,所有可疑位置都打上断点,然后翻页,最终断点位置: window.PSign.sign(colorParamSign)是异步代码,colorParamSign是传入的参数,执行后把包含h5st…

基于YOLOv5的教室人数检测统计系统

基于YOLOv5的教室人数检测统计系统可以有效地用于监控教室内的学生数量,适用于多种应用场景,比如 自动考勤、安全监控或空间利用分析 以下是如何构建这样一个系统的概述,包括环境准备、数据集创建、模型训练以及如何处理不同类型的媒体输入…

【机器学习】--- 序列建模与变分自编码器(VAE)

在机器学习领域,序列建模与变分自编码器(Variational Autoencoder, VAE) 是两个至关重要的技术,它们在处理时间依赖性数据与复杂数据生成任务中都发挥着关键作用。序列建模通常用于自然语言处理、语音识别等需要保持顺序关系的任务…

【老板必看!】电脑怎么看使用软件时间记录?一文读懂5种超实用的方法!

在企业管理中,电脑虽不善言语、不会说话,但会留下无数线索,就像一场未解之谜,等待着各位福尔摩斯得到来,去揭开它的秘密面纱。 你是否曾好奇过,当你不在的时候,员工都在用电脑都在忙些什么&…

基于python+django+vue的影视推荐系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的影…

大表数据如何在OceanBase中进行表分区管理的实践

背景 将Zabbix的数据库迁移至OceanBase后,以其中的几个大表作为案例,本文将分享如何利用ODC(OceanBase 开发者工具),来进行自动管理OB数据库中的表分区的方案。 因为原始表里已经有大量的数据,如果贸然对…

快速掌握Postman接口测试

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、前言 在前后端分离开发时,后端工作人员完成系统接口开发后,需要与前端人员对接,测试调试接口,验证接口的正…

【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL16

使用8线-3线优先编码器Ⅰ实现16线-4线优先编码器 描述 ②请使用2片该优先编码器Ⅰ及必要的逻辑电路实现16线-4线优先编码器。优先编码器Ⅰ的真值表和代码已给出。 可将优先编码器Ⅰ的代码添加到本题答案中,并例化。 优先编码器Ⅰ的代码如下: module…

BERT模型解读与简单任务实现(论文复现)

BERT模型解读与简单任务实现(论文复现) 本文所涉及所有资源均在传知代码平台可获取 概述 相关背景 语言模型:语言模型是指对于任意的词序列,它能够计算出这个序列是一句话的概率。 预训练:预训练是一种迁移学习的概念…

c++类和对象(6个默认成员函数)第二级中阶

目录 6个默认成员函数介绍 构造函数 构造函数是什么? 构造函数的6种特性 析构函数 析构函数是什么? 析构函数的特性 拷贝构造函数 什么是拷贝构造函数 拷贝函数的特性 四.默认生成的拷贝构造实行的是浅拷贝(值拷贝)&am…

【2024】前端学习笔记9-内部样式表-外部导入样式表-类选择器

学习笔记 内部样式表外部导入样式表类选择器&#xff1a;class 内部样式表 内部样式表是将 CSS 样式规则写在 HTML 文档内部。通过<style>标签在 HTML 文件的<head>部分定义样式。 简单示例&#xff1a; <!DOCTYPE html><html><head><style…

【linux】基础IO(上)

1. 共识原理 文件 内容 属性文件分为 打开的文件 没打开的文件打开的文件 &#xff1a; 是进程打开的 ----- 本质是要研究文件和进程的关系没打开的文件 &#xff1a; 没打开的文件储存在磁盘上&#xff0c;由于没打开的文件很多&#xff0c;所以需要分门别类的防止好&…

常用函数式接口的使用

FunctionalInterface注解 函数式接口在java中是指:有且仅有一个抽象方法的接口。 虽然知道怎么使用&#xff0c;但是没有搞懂使用场景&#xff0c;暂且记录下使用方法吧&#xff0c;不至于看到源码的时候不知所云。 要我自己写代码&#xff0c;我是想不起来这样用的&#xff0…

YOLOv9改进策略【注意力机制篇】| 2024 SCSA-CBAM 空间和通道的协同注意模块

一、本文介绍 本文记录的是基于SCSA-CBAM注意力模块的YOLOv9目标检测改进方法研究。现有注意力方法在空间-通道协同方面未充分挖掘其潜力&#xff0c;缺乏对多语义信息的充分利用来引导特征和缓解语义差异。SCSA-CBAM注意力模块构建一个空间-通道协同机制&#xff0c;使空间注…

C语言 结构体和共用体——典型实例:洗发牌模拟

目录 如何表示52张扑克牌&#xff1f; 如何保存一副扑克牌&#xff1f; 如何发牌&#xff1f; 如何设计主函数&#xff1f; 如何模拟洗牌&#xff1f; 如何表示52张扑克牌&#xff1f; 如何保存一副扑克牌&#xff1f; 如何发牌&#xff1f; 如何设计主函数&#xff1f; 如…

窗户检测系统源码分享

窗户检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

十大常用加密软件排行榜|2024年好用的加密软件推荐(企业必备)

在数字化时代&#xff0c;数据安全已经成为企业生存和发展的关键因素之一。随着网络攻击和数据泄露事件的频发&#xff0c;企业对数据加密的需求日益增长。选择一款可靠的加密软件&#xff0c;不仅能保护企业的核心数据&#xff0c;还能确保业务的连续性和合规性。本文将为您介…

Stable Diffusion 使用详解(11)--- 场景ICON制作

目录 背景 controlNet 整体描述 Canny Lineart Depth 实际使用 AI绘制需求 绘制过程 PS打底 场景模型选择 设置提示词及绘制参数 controlnet 设置 canny 边缘 depth 深度 lineart 线稿 效果 背景 这段时间不知道为啥小伙伴似乎喜欢制作很符合自己场景的ICON。…

共享wifi哪家公司正规合法?看这3点就够了!

随着共享wifi项目的热度不断上升&#xff0c;越来越多的公司都开始加入到共享wifi贴码的研发行列之中&#xff0c;让意向入局该项目的创业者拥有更多选择的同时&#xff0c;也让许多想要借此割一波韭菜的不法分子有了可乘之机。在此背景下&#xff0c;共享wifi哪家公司正规合法…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【内核启动】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核&#xff08;LiteOS-M&#xff09; 轻量系统内核&#…