C++性能优化—人工底稿版
C++以高性能著称,性能优化是C++程序员绕不过去的一个话题,性能优化是一个复杂、全局而又细节的问题,本文总结C++性能分析中常用的知识。
性能优化的时机
大部分关于性能优化的文章都强调:不要过早的进行性能优化。
C++编码层面
数据结构和算法
选择最优的数据结构和算法是保证程序性能的基础。
为了极致的性能,有时候还需要根据实际业务定义自己的数据结构和算法。
避免不必要的复制
内联函数
常量表达式
使用 constexpr 使得表达式在编译时计算。
constexpr int square(int x) { return x * x; }int main() {int result = square(5); // 编译时计算return 0;
}
避免不必要的类型转换
避免频繁的类型转换,特别是尽量避免使用 dynamic_cast,尤其是在性能关键路径中。
class Base { public: virtual void doSomething() {} };
class Derived : public Base { public: void doSomething() override {} };int main() {Base* base = new Derived();Derived* derived = static_cast<Derived*>(base); // 使用 static_cast 避免动态类型转换derived->doSomething();delete base;return 0;
}
使用移动优化
……
硬件层面
内存管理
频繁的内存分配和释放导致性能下降,使用内存池来预分配一块大内存区域,避免多次分配和释放内存。
#include <vector>class MemoryPool {
public:
void* allocate(size_t size) {}void deallocate(void* ptr) {}private:
std::vector<void*> freeList;
};
优化常用操作
条件分支导致 CPU 分支预测失败,可以优化代码中条件分支的顺序,避免分支预测失败。
for (int i = 0; i < 1000; ++i) {if (i % 2 == 0) {// 一部分代码,高频的部分可以放在前面} else {// 另一部分代码}
}
编译器优化
充分相信编译器是聪明到了极致,而不是自作聪明的去揣测编译器
并性编程
多线程 并行执行任务,充分利用多核 CPU。
CPU缓存优化
数据访问顺序导致缓存未命中,影响性能,调整内存访问顺序,增加数据的局部性。如下为经典示例
const int SIZE = 10000;
int arr[SIZE][SIZE];// 访问顺序优化,按列访问时可能导致缓存未命中
for (int j = 0; j < SIZE; ++j) {for (int i = 0; i < SIZE; ++i) {arr[i][j] = i * j;}
}// 更好的访问顺序,按行访问
for (int i = 0; i < SIZE; ++i) {for (int j = 0; j < SIZE; ++j) {arr[i][j] = i * j;}
}
I/O 性能
性能分析工具
Visual Studio性能探测器
gprof 进行性能分析
VTune工具
相关文章:
C++性能优化—人工底稿版
C以高性能著称,性能优化是C程序员绕不过去的一个话题,性能优化是一个复杂、全局而又细节的问题,本文总结C性能分析中常用的知识。 性能优化的时机 大部分关于性能优化的文章都强调:不要过早的进行性能优化。 C编码层面 数据结…...
Java 使用腾讯翻译 API 实现含 HTML 标签文本精准翻译工具
一、翻译标签文本工具 package org.springblade.common.utils;import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern;public class TencentTranslationForHTML {public static void main(String[] args) {Stri…...
十款开源的论坛建站工具
以下是十款开源的论坛建站工具,它们各具特色,能够满足不同用户的需求: Discuz!(Crossday Discuz! Board) 特点:基础架构采用web编程组合PHPMySQL,用户可以在不需要任何编程的基础上,…...
vue学习6
1. 智慧商城 1. 路由设计配置 单个页面,独立展示的,是一级路由 2.二级路由配置 规则&组件配置导航链接配置路由出口 <template><div id"app"><!--二级路由出口--><router-view></router-view><van-…...
线程池以及日志、线程总结
一、线程池以及日志 1、基础线程池写法 主线程在main函数中构建一个线程池,初始化(Init)后开始工作(Start) 此时线程池中每个线程都已经工作起来了,只是任务队列中任务为空,所有线程处于休眠状态(通过线程同步中的条件变量实现,…...
Vue 响应式渲染 - 过滤应用
Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue响应式渲染综合 - 过滤应用 目录 过滤应用 引入vue Vue设置 设置页面元素 模糊查询过滤实现 函数表达式实现 总结 过滤应用 综合响应式渲染做一个输入框,用来实现;搜索输入框关键词符合列表。…...
【ThreeJS Basics 1-3】Hello ThreeJS,实现第一个场景
文章目录 环境创建一个项目安装依赖基础 Web 页面概念解释编写代码运行项目 环境 我的环境是 node version 22 创建一个项目 首先,新建一个空的文件夹,然后 npm init -y , 此时会快速生成好默认的 package.json 安装依赖 在新建的项目下用 npm 安装依…...
银行国际结算
银行国结项目,即国际结算项目,是银行业务中的重要组成部分,它涉及跨国界的货币收付和资金转移。 一、银行国结项目的定义 银行国结项目是指银行为国际贸易、投资等活动提供的国际结算服务,包括各种国际支付和资金清算业务。这些…...
Go语言构建微服务:从入门到实战
引言 在云原生时代,微服务架构已成为构建复杂分布式系统的首选方案。Go语言凭借其卓越的并发支持、简洁的语法和高效的运行时,成为微服务开发的利器。本文将深入探讨如何用Go构建健壮的微服务系统,并通过完整案例演示关键实现细节。 一、微…...
深入理解动态代理
为什么需要动态代理 对于代码的增强逻辑我们是清楚具体实现的,一种方式是增强逻辑作为委托类,被其他业务类调用, 这样会有很多重复代码,而且,当需要根据动态参数来决定增强逻辑时,重复代码会更多,逻辑会更不清晰 二,也是动态代理产生的原始需求,解决类爆照问题, 所以…...
私有属性和方法(python)
一、私有属性(属性名前面加两个短下划线) (一)私有属性与公有属性区别 公有属性:在类里面和外面均可以访问和修改 私有属性:需要用set方法才能修改,get方法才能访问 (二…...
Cherry Studio之DeepSeek联网/本地,建属于自己的AI助理!
上一篇文章,讲了DeepSeek-R1部署到本地的方法。这一篇文章,我们让DeepSeek再一次升级,通过图形化界面来交互,从而变成我们的AI助理,让DeepSeek R1发挥最大实力! 首选需要借助硅基流动的API接口,…...
TcpClientTest
ClientTest: using System; using System.Net.Sockets; using System.Text;class TcpClientTest {static void Main(string[] args){try{// 创建一个TcpClient实例并连接到服务器 TcpClient client new TcpClient("1vg5062570.51mypc.cn", 43319);//1v…...
IGBT的两级关断
IGBT(绝缘栅双极型晶体管)的两级关断(Two-stage turn-off)是一种优化关断过程的方法,主要用于减少关断时的电压过冲和dv/dt(电压变化率)过高的问题,特别是在大功率应用中(…...
【STM32】ADC
本次实现的是ADC实现数字信号与模拟信号的转化,数字信号时不连续的,模拟信号是连续的。 1.ADC转化的原理 模拟-数字转换技术使用的是逐次逼近法,使用二分比较的方法来确定电压值 当单片机对应的参考电压为3.3v时,0~ 3.3v(模拟信号…...
从MyBatis-Plus看Spring Boot自动配置原理
一、问题引入:神秘的配置生效之谜 当我们使用MyBatis-Plus时,只需在pom.xml中添加依赖: <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3…...
0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 0基础…...
雪花算法应用
什么是雪花算法? 雪花算法是由 Twitter 开源的分布式 ID 生成算法,用于生成 64 位的长整型唯一 ID。其结构如下: - 1 位符号位:始终为 0 - 41 位时间戳:精确到毫秒 - 10 位工作机器 ID:包含 5 位数据中心 …...
Chapter3:结构化程序设计
参考书籍:《C#边做边学》; 3.结构化程序设计 3.1 结构化程序设计的3种基本结构 顺序结构:先执行 A {\rm A} A语句,再执行 B {\rm B} B语句,两者是顺序执行的关系; 选择结构:根据所定选择条件为…...
白话文实战Nacos(保姆级教程)
前言 上一篇博客 我们创建好了微服务项目,本篇博客来体验一下Nacos作为注册中心和配置中心的功能。 注册中心 如果我们启动了一个Nacos注册中心,那么微服务比如订单服务,启动后就可以连上注册中心把自己注册上去,这过程就是服务注册。每个微服务,比如商品服务都应该注册…...
c语言函数学习
C语言函数学习笔记:从入门到实践 一、什么是函数? 函数是C语言中用于封装特定功能的代码块,是模块化编程的核心。通过函数可以实现: 代码复用:避免重复编写相同逻辑 逻辑清晰:将复杂程序分解为多个小模块…...
linux利用nfs服务器,实现数据和windows环境拷贝
1. 在Linux上设置NFS服务器 1.1 安装NFS服务器软件 首先,你需要在Linux服务器上安装NFS服务器软件。假设你使用的是基于Debian的系统(如Ubuntu),可以按照以下步骤操作: sudo apt update sudo apt install nfs-kerne…...
智能理解 PPT 内容,快速生成讲解视频
当我们想根据一版 PPT 制作出相对应的解锁视频时,从撰写解锁词,录制音频到剪辑视频,每一个环节都需要投入大量的时间和精力,本方案将依托于阿里云函数计算 FC 和百炼模型服务,实现从 PPT 到视频的全自动转换࿰…...
FFmpeg + OpenGL ES 美颜相机教程大纲
做OpenGL和FFmpeg也有很长一段时间了,最近打算结合FFmpegOpenGL ES做一期视频教程,下面是完整视频教程大纲。最终的项目实战效果是实现一款美颜相机。教程分为理论讲解和实战开发两部分,适合有一定编程基础的开发者。课程计划是免费发布在B站…...
IEC61850标准下的数据和数据模型服务的详细介绍
目录 一、摘要 二、概述 三、详细介绍 1、读服务器目录(GetServerDirectory) 2、读逻辑设备目录(GetLogicalDeviceDirectory) 3、读逻辑节点目录(GetLogicalNodeDirectory) 4、读全部数据值(GetAllDataValues) 5、读数据值(GetDataValues) 6、设置数据值(SetDataValues…...
【3.Git与Github的历史和区别】
目录 Git的历史和Github的区别本质和功能 Git的历史和Github的区别 Git是由Linux内核的创造者Linus Torvalds于2005年创建的。当时,Linux内核开源项目使用BitKeeper作为版本控制系统,但2005年BitKeeper的商业公司终止了与Linux社区的合作,收…...
前端页面添加水印
前端页面添加水印 主要功能说明: 这是一个用于添加页面水印的工具函数水印会以半透明的形式显示在页面上,并且会重复平铺水印文字会有-15度的倾斜角度水印会覆盖整个页面,但不会影响页面的正常交互每次调用函数时会先删除已存在的水印&…...
Left side cannot be assigned to
Delphi XE E2064 Left side cannot be assigned to 错误解决方法-CSDN博客 Delphi XE E2064 Left side cannot be assigned to 错误解决方法 1. 起源 此问题源于[秋风人事档案管理系统]用Delphi XE重编译中所发现。 快十年了,当初Delphi 7所编写项目,…...
R语言LCMM多维度潜在类别模型流行病学研究:LCA、MM方法分析纵向数据
全文代码数据:https://tecdat.cn/?p39710 在数据分析领域,当我们面对一组数据时,通常会有已知的分组情况,比如不同的治疗组、性别组或种族组等(点击文末“阅读原文”获取完整代码数据)。 然而,…...
伺服使能的含义解析
前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在开发C#的运动控制程序的时候,一个必要的步骤就是对伺服上使能&#…...
