ZString-unity下的string低gc实现
我们在使用字符拼接的时候,一般都说需要用到string.format或者stringbuilder的append来实现。
首先string的拼接是会有gc的,从android端截取的数据可以看出来,
上面的string.concat是字符串直接拼接
下面的是string.format的小号会比上面的小一点,但还是有128b。
然后我们来看看stringbuilder,如果stringbuilder.append一个int类型的话也是会产生一些gc的
append的gc倒还好,但是我们最终还是要用到字符串,所以tostring的消耗就有点大了。
下面介绍一个叫ZString的字符串拼接方式。
地址如下:https://medium.com/@neuecc/zstring-zero-allocation-stringbuilder-for-net-core-and-unity-f3163c88c887
他有
ZString.Concat(“x:”, x, ” y:”, y, ” z:”, z)
ZString.Format(“x:{0} y:{1} z:{2}”, x, y, z)
ZString.CreateStringBuilder(), Append(), .ToString()
这三种方式拼接,gc也是相对少的,来看看他在手机上的gc:
可以看到比上面两个方法少。
他的实现原理是申请在托管堆外的内存,然后用Span 的方式拼接字符串,以前我们只能用unsafe的方式访问托管堆外的内容。现在可以用span的方式做了。
也就是说拼接的过程完全不会使用托管堆来处理,减少了托管堆的gc的可能性。所以他在拼接过程是肯定完全没有gc的。
那么为什么他还会有40个gc左右呢?
这是因为最终我们需要展示成string,那么还是需要new出一个string来装载我们在非托管堆的buffer,
所以会有这个gc。
整体来说还是比之前优化了不少的。手机上亲测可以用。
https://github.com/Cysharp/ZString
最后附上官方的数据