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

 

最后附上官方的数据

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值