测试环境: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#_字符串拼接_浅相关推荐

  1. 输入5个学生的名字(英文),使用冒泡排序按从大到小排序。 提示:涉及到字符串数组,一个字符串是一个一维字符数组;一个 字符串数组就是一个二维字符数组。...

    输入5个学生的名字(英文),使用冒泡排序按从大到小排序. 提示:涉及到字符串数组,一个字符串是一个一维字符数组:一个 字符串数组就是一个二维字符数组. #include <stdio.h> ...

  2. java返回字符数组_JAVA语言实现随机返回字符串数组中的字符串

    本文主要向大家介绍了JAVA语言实现随机返回字符串数组中的字符串,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. //随机返回字符串数组中的字符串 public static Stri ...

  3. 把字节数组转化成字符串的方法 String (byte[] bytes);String(byte[] bytes, int offset, int length);字符串数组转化成字符串

    字符串数组转化成字符串 String(char[] chars)/String(char[] chars, int offset, int length)类似于字节数组转化成字符串. String ( ...

  4. C++接收字符串数组_C语言处理字符串的7个函数

    C库提供了多个处理字符串的函数,ANSI-C把这些函数的原型放在string.h头文件中.其中最常用的函数有strlen().strcat().strcmp().strncmp().strcpy()和 ...

  5. c#解析json字符串数组_C#解析JSON字符串总结

    JSON文件读取到内存中就是字符串,.NET操作JSON就是生成与解析JSON字符串. 操作JSON通常有以下几种方式: 1. 原始方式:按照JSON字符串自己来解析. 2. 通用方式[★★★★★]: ...

  6. c 字符串数组_C语言探索之旅 | 第二部分第四课:字符串

    内容简介 前言 字符类型 显示字符 字符串其实就是字符的数组 字符串的创建和初始化 从 scanf 函数取得一个字符串 操纵字符串的一些常用函数 总结 第二部分第五课预告 1. 前言 上一课 C语言探 ...

  7. java中如何将字符串数组转换成字符串

    如果是 "字符串数组" 转 "字符串",只能通过循环,没有其它方法 String[] str = {"abc", "bcd&quo ...

  8. android数据截取字符串数组,android - 从Android Studio中的字符串数组获取特定字符串 - SO中文参考 - www.soinside.com...

    我有一个字符串数组(在strings.xml中,我在其中收集所有游戏) ... Fortnite CounterStrike: Global Offensive Minecraft Minigames ...

  9. c++ 字符串连接_C语言字符串操作总结大全(超详细)

    本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, ...

  10. java中如何将字符串数组转换成字符串(转)

    如果是 "字符串数组" 转 "字符串",只能通过循环,没有其它方法 String[] str = {"abc", "bcd&quo ...

最新文章

  1. 防止sql注入的方式php,探讨php中防止SQL注入最好的方法是什么
  2. 卢宇:改善在线教育,人工智能大有可为
  3. 在Bash脚本中,如果发生某种情况,如何退出整个脚本?
  4. UNITY中使用不安全代码的相关设置
  5. java文件的基本操作示例
  6. 可编程交换时代就在这里
  7. 使用bash编写Linux shell脚本--复合命令
  8. C盘的“压缩驱动器以节约磁盘空间”有用吗
  9. MySQL索引类型详解,让MySQL高效运行起来
  10. Linux系统下zookeeper的安装和配置
  11. selenium模拟登陆LinkedIn
  12. MATLAB 图像处理 简单人脸检测(详细,你上你也行)
  13. Chrome谷歌浏览器插件
  14. Xposed安装与使用
  15. excel怎么将文本转为数值
  16. Activity流程引擎表结构
  17. MIT Mini Cheetah–开源代码仿真环境搭建记录(Ubuntu20.04)
  18. 三星c7语言设为英文,三星C7手机如何更改显示语言?简单几步就可轻松搞定!
  19. Python 爬虫问卷星填写
  20. 英语作文计算机的利弊,电脑游戏的坏处英语作文

热门文章

  1. Tips: D3D篇
  2. 【洛谷】P4139 上帝与集合的正确用法
  3. Python网站推荐:Pythontutor(可视化代码执行过程)
  4. 在腾讯、阿里、字节技术岗工作十年能挣普通公务员一辈子的钱吗?
  5. 【每日Linux】《Linux》
  6. SSM框架CRUD操作批量删除批量追加数据(OracleMySQL数据库)
  7. TFTP协议——搭建客户端,用TFTP协议下载文件
  8. 桑吉气泡图 -- KEGG富集气泡图升级版,5维展示富集结果
  9. 渗透测试或安服等面试问题与答案
  10. 使用机器学习和深度学习对PE进行二分类和多分类