2011-07-11 37 views
6

我一直在工作一些程序在这里工作了大约一个月,现在有很多字符串解析,并继续下去。我被建议使用char数组作为这个东西而不是字符串,因为char数组更快。我明白为什么char数组很快,但是它是什么使字符串类型变慢?它实现了什么样的数据结构,并且有什么方法使它像char数组一样快?字符串类型的.NET与字符数组

回答

13

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

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

所以,如果你想改变字符串的小部分,你需要使用StringBuilderchar[]。由于StringBuilder具有额外的验证和间接指令,因此这两个char[]中的/更快。但是由于这是一个实现细节,它可能在我上次测试之后发生了变化。


只是基准它,并作为.NET 4的设定相比StringBuilderchar[]成员大约快四倍。但两者都可以每秒完成超过2亿次的任务,所以它在实践中很少重要。

char[]读取的速度稍快(我的测试代码为25%),从string读取。另一方面,从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]; 
} 

(是的,我知道我的基准代码不是很好,但我不认为它使一个很大的区别。)

+0

有性能增益与字符串在内存方面因为所有的字符串都被拦截。 – koumides

+0

@koumides只有你明确被监听的字符串和字符串被限制。 – CodesInChaos

1

char数组在字符串上的优点是可以在适当位置更改字符数组;在C#中字符串是不可变的,所以任何更改都会在堆上创建一个新的对象,并使用该字符串的更改版本。在一个char数组中,你可以做很多修改而不需要在堆上分配任何东西。