C# 提高字符串生成器的性能
通过使用线程堆栈上分配的C# 提高字符串生成器的性能,c#,.net,C#,.net,通过使用线程堆栈上分配的char[]使用指针按字符构建字符串,可以优化扩展的StringBuilder.Append()操作吗 unsafe { const Int32 width = 1024; Char* msg = stackalloc Char[width]; Int32 index = 0; property = Environment.MachineN
char[]
使用指针按字符构建字符串,可以优化扩展的StringBuilder.Append()
操作吗
unsafe
{
const Int32 width = 1024;
Char* msg = stackalloc Char[width];
Int32 index = 0;
property = Environment.MachineName;
for (Int32 i = 0; i < property.Length; i++)
msg[index++] = property[i];
return new String(msg, 0, width);
}
不安全
{
常数Int32宽度=1024;
Char*msg=stackalloc Char[width];
Int32指数=0;
属性=Environment.MachineName;
for(Int32 i=0;i
与使用
StringBuilder
相比,这提供了大约25%的改进,但结果并不令人满意。如果您对最终字符串的大小有一个预先的想法(就像您所做的那样),您可以使用该容量构建StringBuilder
,因此,它花费更少的时间重新分配空间:
var sb = new StringBuilder();
// capacity 16, will expand as needed
var sb30000 = new StringBuilder(30000);
// capacity 30000, will not need to expand until that length is passed
这可能有点帮助。@Nuffin-Umm,也许是第一行?只需要一个问号。然而,这个问题似乎与第二行不一致,也许OP想要一个新的版本。您是否通过实验测量了使用StringBuilder.Append对您的应用程序来说是一个瓶颈,并且您确实需要降低到指针和不安全代码级别?或者,您只是过早地试图在没有充分理由的情况下节省几个CPU周期?StringBuilder可以有一个初始容量,这可能会给您带来与字符数组相同的好处,您是否尝试过使用不同的初始容量?基本上就是这样-重新分配确实需要时间。在那之后,我会说,你必须有非常特殊的代码,才能真正发挥作用。