字符串类型.NET与char数组

MGZ*_*ero 9 .net arrays string char

我已经在这里工作了一些程序,现在有大量的字符串解析等等.我被建议使用char数组来代替字符串,因为char数组更快.我理解为什么char数组很快,但字符串类型是什么让它变慢?它实现了什么数据结构,有没有办法使它像char数组一样快?

Cod*_*aos 16

最明显的区别string是不可变.因此,您无法修改其中的部分内容,需要在每次修改时创建一个全新的副本.

String本身有一个非常特殊的实现(它是一个可变大小的类),并且没有数组支持.我认为没有理由为什么char字符串中s的只读访问应该很慢.

因此,如果要更改字符串的小部分,则需要使用StringBuilder或者char[].其中两个char[]更快/更快,因为StringBuilder有额外的验证和间接.但是因为这是一个实现细节,所以自从我上次测试它以来它可能已经改变了.


只是对它进行了基准测试,从.NET 4开始,设置成员的char[]速度大约是a的四倍StringBuilder.但是两者每秒可以完成超过200万次的任务,所以在实践中它很少重要.

从a读取的char[]速度略快(我的测试代码为25%)string.从阅读StringBuilder另一方面比从读出速度较慢(3倍)char[].

在所有基准测试中,我忽略了其他代码的开销.这意味着我的测试低估了差异.

我的结论是,虽然char[]速度比替代方案快,但只有你每秒超过数百兆字节才有意义.


//Write StringBuilder
StringBuilder sb = new StringBuilder();
sb.Length = 256;
for(int i=0; i<1000000000; i++)
{
    int j = i&255;
    sb[j] = 'A';
}

//Write char[]
char[] cs = new char[256];
for(int i=0; i<1000000000; i++)
{
    int j = i&255;
    cs[j] = 'A';
}

// Read string
string s = new String('A',256);
int sum = 0;
for(int i=0; i<1000000000; i++)
{
    int j = i&255;
    sum += s[j];
}

//Read char[]
char[] s = new String('A',256).ToCharArray();
int sum = 0;
for(int i=0; i<1000000000; i++)
{
    int j = i&255;
    sum += s[j];
}

//Read StringBuilder
StringBuilder s= new StringBuilder(new String('A',256));
int sum = 0;
for(int i=0; i<1000000000; i++)
{
    int j = i&255;
    sum += s[j];
}
Run Code Online (Sandbox Code Playgroud)

(是的,我知道我的基准代码不是很好,但我不认为它有很大的不同.)


ant*_*oft 5

与字符串相比,char 数组的优势在于您可以就地更改字符数组;在 C# 中,字符串是不可变的,因此任何更改都会在堆上创建一个具有更改版本的字符串的新对象。在 char 数组中,您可以进行大量更改而无需在堆上分配任何内容。