char []创建不安全的字符串

Aid*_*api 7 c# string performance unsafe

我正在研究一种高性能代码,其中该构造是性能关键部分的一部分.

这是在某些部分中发生的情况:

  1. A string被"扫描"并且元数据被有效存储.
  2. 基于此元数据,主字符串的块被分成一个char[][].
  3. char[][]应该转移到string[].

现在,我知道你可以打电话,new string(char[])但结果必须复制.

为了避免发生这种额外的复制步骤,我想我必须可以直接写入字符串的内部缓冲区.即使这将是一个不安全的操作(我知道这带来了许多影响,如溢出,向前兼容).

我已经看到了实现这一目标的几种方法,但没有一种我真的很满意.

有没有人有关于如何实现这一目标的真实建议?

额外信息:
实际过程不包括转换为char[]必然,它实际上是一个"多子串"操作.像3个索引和它们的长度附加.

StringBuilder有少数concats的开销太大.

编辑:
由于我要求的一些模糊的方面,让我重新拟定它.

这是发生的事情:

  1. 主字符串已编入索引.
  2. 主字符串的一部分被复制到一个char[].
  3. char[]被转换为一个string.

我想做的是合并第2步和第3步,结果是:

  1. 主字符串已编入索引.
  2. 主字符串的一部分被复制到一个string(并且GC在过程中可以通过正确使用fixed关键字来保持它的手离开?).

需要注意的是,我无法从string []更改输出类型,因为这是一个外部库,项目依赖于它(向后兼容性).

Ben*_*igt 2

如果你这样做会发生什么:

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';
}
Run Code Online (Sandbox Code Playgroud)

我认为世界将会终结(或者至少是 .NET 管理的部分),但这已经非常接近了StringBuilder

您是否有分析器数据表明该数据StringBuilder对于您的目的来说不够快,或者这是一个假设?