繁体   English   中英

字符串类型 .NET 与 char 数组

[英]string type .NET vs. char array

我已经在这里工作了大约一个月的一些程序,这些程序有很多字符串解析等等。 有人建议我对这些东西使用 char 数组而不是字符串,因为 char 数组更快。 我理解为什么 char 数组很快,但它是什么让字符串类型变慢? 它实现了什么数据结构,有什么方法可以让它像 char 数组一样快?

最明显的区别是string是不可变的。 所以你不能修改它的一部分,并且需要在每次修改时创建一个全新的副本。

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

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


刚刚对其进行了基准测试,从 .NET 4 开始,设置char[]的成员的速度大约是StringBuilder的四倍。 但两者都可以每秒完成超过 2 亿次的任务,因此在实践中并不重要。

char[]读取比从string读取稍快(我的测试代码为 25%)。 另一方面,从StringBuilder读取比从char[]读取慢(3 倍)。

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

我的结论是,虽然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];
}

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

char arrays 优于字符串的优点是您可以更改字符 arrays ; 在 C# 中,字符串是不可变的,因此任何更改都会在堆上创建一个新的 object 并使用更改的字符串版本。 在 char 数组中,您可以进行大量更改而无需在堆上分配任何内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM