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)
(是的,我知道我的基准代码不是很好,但我不认为它有很大的不同.)
与字符串相比,char 数组的优势在于您可以就地更改字符数组;在 C# 中,字符串是不可变的,因此任何更改都会在堆上创建一个具有更改版本的字符串的新对象。在 char 数组中,您可以进行大量更改而无需在堆上分配任何内容。