您当前的位置: 首页 >  unity

VT LI

暂无认证

  • 6浏览

    0关注

    126博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

ZString-unity下的string低gc实现

VT LI 发布时间:2020-07-08 19:53:19 ,浏览量:6

    我们在使用字符拼接的时候,一般都说需要用到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

 

最后附上官方的数据

关注
打赏
1649603425
查看更多评论
立即登录/注册

微信扫码登录

0.3682s