问答1 问答5 问答50 问答500 问答1000

临时字符串拼接的优化

提问网友 发布时间:2024-05-04 15:51
声明声明:本网页内容为用户发布,旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:1656858193@qq.com
1个回答
热心网友 回答时间:2024-05-12 08:29
字符串拼接在高级语言中事件很让人头疼的事情,无论是内存申请的额外耗时还是产生临时内存造成的大量gc都是很难优化的,最近在c#中采用了一种优化方案,在此记录一下。

首先我们要明白c#对字符串的处理是怎么样的:

c#对一些通常的字符串操作,是做了缓存的优化的,string作为一个引用类型,不同的变量只要内容相同,实质上都是指向同一个引用,我们可以用下述方法获取变量内存地址来一探究竟:

观察输出可以发现,字符串s1,s2虽然是通过不同方式拼接的,但是因为其内容一致,引用指向的内存地址都是相同的。

c#在常用的字符串操作中都采用了这样的优化方式,但是可以通过new string的方式来构建一个新的string引用,可以看到上面的字符串s3虽然内容与s1,s2都相同,但是地址却是不一样的。

在字符串拼接时,实质上并没有对原有字符串做任何改变,而是检查是否全局已经缓存了相同字符串,如果缓存了就返回引用,没有的话便重新创建一个新的string,直到下一次gc被回收,这样也就解释了为什么我们拼接不同结果字符串的时候会产生大量的内存垃圾。

想要优化字符串拼接的话,我们需要进一步探究string的本质:

c#中的string是一个引用类型的class,其本质是一个含有一些描述信息的char数组,但是我们对本质的探究到这里并没有停止。

对业务层而言,我们需要的字符串到底是什么?按最终用途可以分成两类:

业务中一大部分的字符串,最终实际上都会转变为数据流,比如网络消息和写文件。实际上我们并不需要产生string类,使用自己维护的char数组来记录字符数据,然后直接输出为二进制流,之后再对char数组进行回收重用,可以彻底解决string类产生的gc和内存压力。

需要注意的是,如果需要对字符流编码,可以使用encoder的原生方法:

对于业务中需要传递给不可控接口的string,我们需要对接口需要的string进行判断,然后通过修改string内容的方式,对string这一类进行重用。要知道虽然c#没有提供string内容修改的接口,但是string本质上也还是char数组,对其内容修改相当容易:

缓存的策略类似普通的缓存池,需要新字符串时,从string池中取出一个长度足够的(不够就新建),从头填充正确的数据,最后对多余的尾部按需修改填充,用完放回池子。

对于渲染类的string一般都好处理,重用string时尾部填充‘\0'就可以,例如unity中的Text组件就可以采用这样的策略。(unity在读到\0后就不读了,所以实际上只要把不需要的第一个位置填上\0就好)

对于json这样的字符串标记语言来说就要麻烦一些了,如果项目中的json解析类是可以修改的,还可以用\0来表示终止,但是遇到外部库这样的,不知道是否对\0做处理的话,只能在数据传输时约定一个特殊key,内容填空字符串,通过这样的方式来补全string多余的无用位置了。

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

联想r7000与r7000p有什么不同? 股票里总手是什么意思? 青霉素和地塞米松一起用还发烧是什么原因 哈尔滨银行倒闭的详细过程 ...是代表什么吗我爸爸去世了经常两只颜色鲜艳的鸟 我女儿去世飞出个小鸟是啥意思? 魔兽世界在我自己的电脑上显示你已断开连接BLZ51901021,但是在网吧... 桑椹怎么保存时间长桑葚如何保存时间长 新鲜桑椹长期保存方法新鲜桑椹如何长期保存 新鲜桑葚叶子如何晒干保存呢 新鲜桑葚叶子怎么晒干保存 梦见差点要被人扔下楼梯的预兆 怎么判断凤梨是不是变质如何判断凤梨是不是变质 lm writing to tom对(writing to tom)提问 奥迪a6l怎么用空调 少儿编程学费多少钱? 刚刚把自己一头红头发染黑了,搞的脸上额头上脖子上,还有手上都是黑漆漆... 下列哪个不是python语言的合法变量? A for B while C if D print 在python编程中 if users_list: 是什么意思 if后面的判断不应该有条件嘛... 常喝蜂蜜水对人体脸上皮夫有好处吗 游戏安装在机械硬盘上有用吗,游戏装在机械硬盘里有影响吗 宋慈因何被尊为世界法医学鼻祖 宋慈生平简介 住院花费5万元新农合能报多少 明亮的近词是 为什么抽血的时候出血慢 ...2011年各个国家的财产保险深度和密度,从什么地方可以查到?_百度知 ... 保险官网排名怎么查 我属于宿舍中的沉默者,感到孤独难过,无法插入他们的对话,我该怎么... 男孩单字名字美好韵意让宝宝的名字诗意有韵味 2023年12月最新网贷政策汇总。 22点12小时后是几点 本硕连读的学校有哪些 小米手机回收全攻略! 小米以旧换新操作流程是什么? 重疾险不续费算不算自动退保 与信号系统相关联的设备有哪些 无线信号增强器 无线网络信号接收器 无线信号放大器有什么区别_百度知 ... 琥珀打磨是有墨汁的味道 为什么 大学怎样查自己的成绩? 在放大电路中RE的值对交流放大倍数有无影响 三极管的放大倍数的问题