我正在研究一种高性能代码,其中这个结构是性能关键部分的一部分.
这是在某些部分中发生的情况:
>字符串被“扫描”并且元数据被有效存储.
>基于此元数据,主字符串的块被分成char [] [].
>那个char [] []应该转换成一个字符串[].
现在,我知道你可以调用新的字符串(char []),但结果必须被复制.
为了避免这个额外的复制步骤发生,我想我必须可以直接写入字符串的内部缓冲区.即使这将是一个不安全的操作(我知道这带来了许多影响,如溢出,向前兼容).
我已经看到了实现这一目标的几种方法,但没有一种我真的很满意.
有没有人有关于如何实现这一目标的真实建议?
额外的信息:
实际过程不包括转换为char []必然,它实际上是一个’多子串’操作.像3个索引和附加的长度.
StringBuilder对于少量的concats来说有太多的开销.
编辑:
由于我所要求的一些含糊不清的方面,让我重新拟定它.
这是发生的事情:
>主字符串已编入索引.
>主字符串的一部分被复制到char [].
> char []转换为字符串.
我想要做的是合并第2步和第3步,结果是:
>主字符串已编入索引.
>主要字符串的一部分被复制到一个字符串(并且GC在此过程中可以通过正确使用fixed关键字来保持其手离开?).
需要注意的是,我无法从string []更改输出类型,因为这是一个外部库,项目依赖于它(向后兼容性).
解决方法
如果您这样做会发生什么:
string s = GetBuffer(); fixed (char* pch = s) { pch[0] = 'R'; pch[1] = 'e'; pch[2] = 's'; pch[3] = 'u'; pch[4] = 'l'; pch[5] = 't'; }
我认为世界将会结束(或者至少是.NET管理的部分),但这与StringBuilder的作用非常接近.
您是否有分析器数据显示StringBuilder不够快,或者这是一个假设?