【Unity C#优化】业务逻辑代码方面的优化

代码方面的优化,主要是以降低内存的开辟和清理,提高CPU缓存命中率,利用多线程,为核心所进行的。

1.List与Dictionary的优化

List和Dictionary核心都是数组,Insert插入和Remove删除都要对数组进行复制和拷贝移动。并且每次扩容时,也会创建新的内存空间。

因此在创建时,最好规定一个预期容量,不要交给程序自己扩容。并且少用Insert插入接口。

2.巧用struct

struct是值类型,内存分配在栈上,栈是内存连续,回收快速简单,不会产生内存碎片,也不需要内存垃圾回收,CPU读取数据对连续内存很友好和高效。

struct数组的内存空间和值类型是连续的,调用时CPU的缓存命中率高。(CPU在读取数据时,会将数据缓存下来,下次先从缓存中找数据,如果命中,则不需要在内存中读取数据)

而class是引用类型,class数组中的每个对象都是堆上的独立内存空间,而数组的引用相当于C++的指针地址,数组中只有引用空间内存是连续的。缓存机制的命中率要照struct数组大大降低。

但如果struct太大,超过了缓存机制上线,则缓存机制不在起作用。可以使用值类型的数组来提高缓存命中率。

将A类的数组

Class A
{public int a;public float b;public bool c;
}

改为B类中的int数组、float数组、bool数组的形式

Class B
{public int[] a;public float[] b;public bool[] c;
}

A类数据是内存分散的,并且每个A的实例也是内存分散,只有arrayA的引用是连续的。

而B类中每个数组都是内存连续的(值类型的数组一定是内存连续),这样能更好地利用缓存,提高CPU读取数据时缓存的命中率。

3.对象池

使用对象池来减少对象的创建和回收。

对于普通对象也可以使用对象池,特别是使用List和Dictionary时,添加和回收都通过对象池进行操作。

可以大大降低内存的分配和释放所带来的消耗。

而且可以开局对对象池进行初始化,降低临时开辟内存所带来的开销。

4.string字符串相关

(1)缓存项目中的常用字符串

通过ID或Dictionary字典将项目中字符串缓存下来。下次调用时就不需要开辟新内存了。

(2)通过指针更改缓存字符串中的值

使用Dictionary字典缓存,字符串长度作为Key,字符串作为value。
使用字符串前,调用方法,如有相同长度的字符串,则通过指针将字符串中的值更改为期望值。

Dictionary<int, string> cacheStr;Public unsafe string Concat(string strA, string strB)
{int a_length = strA.Length;	int b_length = strB.Length;	int sum_length = a_length + b_length;string strResult = null;if(!cacheStr.TryGetValue(sum_length, out strResult)){strResult = strA + strB;cacheStr.Add(sum_length, strResult);return strResult;}fixed(char* strA_ptr = strA){fixed(char* strB_ptr = strB){fixed(char* strResult_ptr =strResult){memcopy((byte*)strResult_ptr, (byte*)strA_ptr, a_length * sizeof(char));memcopy((byte*)strResult_ptr + a_length, (byte*)strB_ptr, b_length * sizeof(char));}}}return strResult;
}public unsafe void memcopy(byte* dest, byte* src, int len)
{while((--len) >= 0){dest[len] = src[len];}
}

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

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

相关文章

kubernetes Dashboard搭建 (六)

DashBoard 之前在kubernetes中完成的所有操作都是通过命令行工具kubectl完成的。其实&#xff0c;为了提供更丰富的用户体验&#xff0c;kubernetes还开发了一个基于web的用户界面&#xff08;Dashboard&#xff09; 用户可以使用Dashboard部署容器化的应用&#xff0c;还可以监…

<数据集>木材缺陷检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;4000张 标注数量(xml文件个数)&#xff1a;4000 标注数量(txt文件个数)&#xff1a;4000 标注类别数&#xff1a;8 标注类别名称&#xff1a;[Quartzity,Live_Knot,Marrow,resin,Dead_Knot,knot_with_crack,Knot_m…

Prometheus 监控 Java 应用 JMX Exporter

操作场景 Prometheus 社区开发了 JMX Exporter 用于导出 JVM 的监控指标&#xff0c;以便使用 Prometheus 来采集监控数据。当您的 Java 业务容器化至 Kubernetes 后&#xff0c;可通过本文了解如何使用 Prometheus 与 JMX Exporter 来监控 Java 应用。 JMX Exporter 简介 Ja…

如何在 Puppeteer 中运行无头浏览器?

什么是无头浏览器&#xff1f; 我们都知道&#xff0c;用户界面&#xff08;UI&#xff09;是任何软件中最重要的部分。因此&#xff0c;“无头浏览器”的“无头”部分意味着它们确实缺少一个关键元素&#xff0c;即图形用户界面&#xff08;GUI&#xff09;。 这意味着浏览器…

探索.NET内存之海:垃圾回收的艺术与实践

简述 在.NET的广阔天地中&#xff0c;内存管理如同航海中的罗盘&#xff0c;指引着程序的稳健运行和性能的极致优化。作为软件工程师&#xff0c;我们时常在代码的海洋中航行&#xff0c;而内存管理则是确保航程顺畅的关键。本文将带您深入.NET的内存管理世界&#xff0c;一探垃…

webrtc QOS方法十三(视频渲染平滑)

一、背景介绍 视频渲染时间的确定需要考虑三方面的因素&#xff1a;网络抖动、网络延时、音视频同步 网络抖动&#xff1a;视频帧在网络上传输&#xff0c;会受到网络抖动的影响&#xff0c;不能收到立刻播放&#xff0c;需要进行适当的平滑 网络延时&#xff1a;一些报文在…

mysql8和mysql5版本在使用mybatis框架时的注意事项

mysql8和mysql5版本在使用mybatis框架时有些注意事项&#xff0c;两者的区别在于两处地方的设置。有一处未设置好&#xff0c;就会出现以下错误&#xff1a;java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Can…

基于深度学习的车距检测系统

1. 引言 详细内容&#xff1a; 车距检测在自动驾驶和驾驶辅助系统中具有重要意义&#xff0c;可以帮助避免车辆碰撞事故&#xff0c;提升驾驶安全性。YOLO&#xff08;You Only Look Once&#xff09;系列模型在实时目标检测中表现优异&#xff0c;可以用于车距检测任务。本文…

docker 安装并测试(Ubuntu下)

1. 确认安装环境&#xff08;操作系统版本和 CPU 架构&#xff09; 2. 如果有旧版本的 docker 需要进行卸载 使用 docker 命令检查是否已经安装了 docker 如果 docker 已经安装&#xff0c;使用以下命令卸载&#xff1a; apt-get purge docker-ce docker-ce-cli containerd…

@RequestBody接收到的参数中如何限制List的长度?

在Spring MVC中&#xff0c;你可以使用Valid注解和自定义的验证注解来限制List的长度&#xff0c;防止DOS攻击。具体步骤如下&#xff1a; 创建自定义注解&#xff1a;首先&#xff0c;创建一个自定义注解来验证List的长度。 import javax.validation.Constraint; import jav…

力扣3202:找出有效子序列的最大长度||

class Solution { public:int maximumLength(vector<int>& nums, int k) {int res0;for(int m0;m<k;m){//假设子序列两数%k之后的结果为m 相当于枚举vector<int> v(k,0);for(auto num:nums){v[num%k]v[(m-num%kk)%k]1; //知道m之后可以知道需要的子序列当前…

maven内网依赖包编译报错问题的一种解决方法

背景 外网开发时可以连接互联网&#xff0c;所以编译没有什么问题&#xff0c;但是将数据库、代码、maven仓库全部拷贝到内网&#xff0c;搭建内网环境之后&#xff0c;编译失败。 此依赖包的依赖层级图 maven镜像库配置使用拷贝到内网的本地库&#xff0c;配置如下&#xff…

【Linux】Linux环境设置环境变量操作步骤

Linux环境设置环境变量操作步骤 在一些开发过程中本地调试经常需要依赖环境变量的参数&#xff0c;但是怎么设置对小白来说有点困难&#xff0c;今天就介绍下具体的操作步骤&#xff0c;跟着实战去学习&#xff0c;更好的检验自己的技术水平&#xff0c;做技术还是那句话&…

【iOS】——内存对齐

内存对齐是什么 内存对齐指的是数据在内存中的布局方式&#xff0c;它确保每个数据类型的起始地址能够满足该类型对齐的要求。这是因为现代处理器在访问内存时&#xff0c;如果数据的起始地址能够对齐到一定的边界&#xff0c;那么访问速度会更快。这种对齐通常是基于数据类型…

BUUCTF逆向wp [MRCTF2020]Transform

第一步 查壳。该题为64位。 第二步 进入主函数&#xff0c;跟进dword_40F040,它应该与关键字符串有关 分析一下&#xff1a; 初始化和输入 sub_402230(argc, argv, envp); 这行可能是一个初始化函数&#xff0c;用于设置程序环境或处理命令行参数。具体功能不明&#xff0c…

高性能、安全、低碳绿色的趋势下,锐捷网络发布三擎云办公解决方案 3.0

桌面虚拟化作为云时代的主流和热门技术&#xff0c;已经取得了广泛应用。随着生成式 AI 爆炸式发展&#xff0c;CSDN 看到&#xff0c;人工智能正在引发计算、开发、交互三大范式的全面升级&#xff0c;技术开发或将迎来一次全新的科技变革周期&#xff0c;因此 VDI 云桌面随之…

C#语法基础详解(万字总结)

文章目录 **参考书籍&#xff1a;C#7.0 核心技术指南**类型类字段解构器对象初始化器属性表达式属性(只读属性才可以)自动属性属性初始化器 索引器静态构造器nameof运算符 继承类型转换和引用转换as运算符is运算符is与模式变量 虚函数成员抽象类和抽象成员new和重写base关键字构…

Android C++系列:Linux线程(四)线程同步

多个线程同时访问共享数据时可能会冲突,这跟我们前面信号文章所说的可重入性是同样的问题。比如两个线程都要把某个全局变量增加1,这个操作在某平台需要三条指令完成: 从内存读变量值到寄存器;寄存器的值加1;将寄存器的值写回内存假设两个线程在多处理器平台上同时执行这三…

JavaSE学习复习题总结

一.什么是继承与多态&#xff1f; 1.继承 2.多态多态是面向对象编程的另一个核心特性&#xff0c;它允许我们以统一的接口处理不同的对象。在Java中&#xff0c;多态通常通过方法的重写&#xff08;Override&#xff09;和重载&#xff08;Overload&#xff09;以及接口&#…

【linux】Shell脚本中While循环的详细用法教程

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…