c# 拼接字符串数组_C#_字符串拼接_浅
测试环境:Unity2018.4;.Net4.x。需要注意.Net4.x和3.5差异还是挺大的
写的内容大部分网上已有,算是总结他人的成果,是浅谈。
1、先说几条结论:
1_1、字符串在C#中是高频出现的
1_2、这类高频出现方法、字段通常不是每帧的性能瓶颈。但有可能是瞬间卡顿的来源。
1_3、字符串内存开销计算:26b(基础开销) + string.Length * sizeof(char)。如字符串“1”:28b开销
1_4、值类型,与字符串拼接不要偷懒,记得加上.ToString();
1_5、字符串拼接应尽量控制在4个以内
1_6、解决1_5中的问题
2、解释。
2_1、因为System.Object这个C#醉基础的类都有ToString();方法,其必然是个通用且极易出现的东西。
2_2、一个非常非常基础的东西如果存在性能问题,其上下文很有可能有问题或很可能存在更大的性能问题。如调用次数过高等。
2_3、此处是基础,且自己可能很轻松推算出。
2_4、开始正式聊C#字符串的拼接了。
2_4_1、即String.Concat方法,其内部有两类方法即String.Concat(string, string);和String.Concat(object, object);
2_4_2、string + string就不用说了,字符串拼接是字符串 + 字符串很合理。object + object同样也容易理解,字符串拼接时其参数可以是五花八门,且ToString()是System.Object内的方法,所以用object来承载参数是很合理的。它相当于String.Concat(object, object) -> String.Concat(object.ToString(), object.ToString());
2_4_3、那就意味着,值类型 + 字符串会走String.Concat(object, object);就以1 + "abc"为例
2_4_4、那首先,值类型 -> object存在一次装箱,以int类型为例,其内存开销为16b + sizeof(int)。即20b的开销,自然其也有cpu开销【但先忽略,因为其很低】。
2_4_5、其次object(1) -> string时,C#会生成字符串"1",即28b开销。
2_4_6、最终结果为"1abc",即34b开销。过程中共产生82b开销
2_4_7、如果写成1.ToString() + "abc"呢?首先1.ToString();开销28b,结果34b,共计62b。
2_4_8、主要问题就出现在值类型转object时的那次开销。次要问题,毕竟又多了object -> string开销。所以无论怎样,肯定是要加上.ToString();划算
2_5、String.Concat重载有很多,但直接传入的参数最多支持4个,超过4个时,如果是string相加,会走String Concat(params String[])。
2_5_1、以图中③处5个字符串相加时为例,C#会生成string[5]去容纳这些参数,其开销为32b + sizeof(char*) * 5 = 72。值得一提的是,在.Net3.5中,数组的起始开销是40b,所以此处在.net3.5中是80b,至于多出的8b是啥呢?可自己查查玩。
2_5_2、当我们真的用工具看其内存开销时,其开销是180b,这是因为.Net4.x中做了线程安全处理,即C#会将传入的string[5]套娃复制一遍,以免出现其他线程修改其内容的问题,所以这里会翻倍变成144b。再加上结果"12345"36b,就是180b
2_5_3、值得一说的是在.Net3.5中是没有线程安全这项处理的,所以其最终开销为80b + 36b = 116b。我TM谢你啊~
2_5_4、回到图中①处,4个字符串相加时34b,5个就飙升至180b,这里真的不可谓不坑爹。这也算C#这类以方便换性能所谓高级语言的一个毛病了。所以绝大多数引擎使用C++写代码是有原因的。
2_5_5、图中④处,其实并不是好思路,万一几个字符串长有一万米,那多算的一次result开销会远大于2次string[5]数组。但如果没有解决的问题,且拼接字符串都很短,这个方法可能有点用。但……内存碎片的隐患值得吗?
2_6、可以自行思考下,并且网上其实也有相关的解决方法,后面哪天有时间再写个字符串拼接更深入一些的内容。其实C#字符串操作方面可聊的实在太多,也可能等明年闲一点做个视频说下。
c# 拼接字符串数组_C#_字符串拼接_浅相关推荐
- 输入5个学生的名字(英文),使用冒泡排序按从大到小排序。 提示:涉及到字符串数组,一个字符串是一个一维字符数组;一个 字符串数组就是一个二维字符数组。...
输入5个学生的名字(英文),使用冒泡排序按从大到小排序. 提示:涉及到字符串数组,一个字符串是一个一维字符数组:一个 字符串数组就是一个二维字符数组. #include <stdio.h> ...
- java返回字符数组_JAVA语言实现随机返回字符串数组中的字符串
本文主要向大家介绍了JAVA语言实现随机返回字符串数组中的字符串,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. //随机返回字符串数组中的字符串 public static Stri ...
- 把字节数组转化成字符串的方法 String (byte[] bytes);String(byte[] bytes, int offset, int length);字符串数组转化成字符串
字符串数组转化成字符串 String(char[] chars)/String(char[] chars, int offset, int length)类似于字节数组转化成字符串. String ( ...
- C++接收字符串数组_C语言处理字符串的7个函数
C库提供了多个处理字符串的函数,ANSI-C把这些函数的原型放在string.h头文件中.其中最常用的函数有strlen().strcat().strcmp().strncmp().strcpy()和 ...
- c#解析json字符串数组_C#解析JSON字符串总结
JSON文件读取到内存中就是字符串,.NET操作JSON就是生成与解析JSON字符串. 操作JSON通常有以下几种方式: 1. 原始方式:按照JSON字符串自己来解析. 2. 通用方式[★★★★★]: ...
- c 字符串数组_C语言探索之旅 | 第二部分第四课:字符串
内容简介 前言 字符类型 显示字符 字符串其实就是字符的数组 字符串的创建和初始化 从 scanf 函数取得一个字符串 操纵字符串的一些常用函数 总结 第二部分第五课预告 1. 前言 上一课 C语言探 ...
- java中如何将字符串数组转换成字符串
如果是 "字符串数组" 转 "字符串",只能通过循环,没有其它方法 String[] str = {"abc", "bcd&quo ...
- android数据截取字符串数组,android - 从Android Studio中的字符串数组获取特定字符串 - SO中文参考 - www.soinside.com...
我有一个字符串数组(在strings.xml中,我在其中收集所有游戏) ... Fortnite CounterStrike: Global Offensive Minecraft Minigames ...
- c++ 字符串连接_C语言字符串操作总结大全(超详细)
本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, ...
- java中如何将字符串数组转换成字符串(转)
如果是 "字符串数组" 转 "字符串",只能通过循环,没有其它方法 String[] str = {"abc", "bcd&quo ...
最新文章
- 防止sql注入的方式php,探讨php中防止SQL注入最好的方法是什么
- 卢宇:改善在线教育,人工智能大有可为
- 在Bash脚本中,如果发生某种情况,如何退出整个脚本?
- UNITY中使用不安全代码的相关设置
- java文件的基本操作示例
- 可编程交换时代就在这里
- 使用bash编写Linux shell脚本--复合命令
- C盘的“压缩驱动器以节约磁盘空间”有用吗
- MySQL索引类型详解,让MySQL高效运行起来
- Linux系统下zookeeper的安装和配置
- selenium模拟登陆LinkedIn
- MATLAB 图像处理 简单人脸检测(详细,你上你也行)
- Chrome谷歌浏览器插件
- Xposed安装与使用
- excel怎么将文本转为数值
- Activity流程引擎表结构
- MIT Mini Cheetah–开源代码仿真环境搭建记录(Ubuntu20.04)
- 三星c7语言设为英文,三星C7手机如何更改显示语言?简单几步就可轻松搞定!
- Python 爬虫问卷星填写
- 英语作文计算机的利弊,电脑游戏的坏处英语作文