我一直在工作一些程序在这里工作了大约一个月,现在有很多字符串解析,并继续下去。我被建议使用char数组作为这个东西而不是字符串,因为char数组更快。我明白为什么char数组很快,但是它是什么使字符串类型变慢?它实现了什么样的数据结构,并且有什么方法使它像char数组一样快?字符串类型的.NET与字符数组
6
A
回答
13
最明显的区别是string
是不可变的。所以你不能修改它的一部分,并且需要在每次修改时创建一个全新的副本。
字符串本身有一个非常特殊的实现(它是一个可变大小的类),不支持数组。我没有看到为什么只读访问字符串中的char
应该很慢。
所以,如果你想改变字符串的小部分,你需要使用StringBuilder
或char[]
。由于StringBuilder
具有额外的验证和间接指令,因此这两个char[]
中的/更快。但是由于这是一个实现细节,它可能在我上次测试之后发生了变化。
只是基准它,并作为.NET 4的设定相比StringBuilder
的char[]
成员大约快四倍。但两者都可以每秒完成超过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];
}
(是的,我知道我的基准代码不是很好,但我不认为它使一个很大的区别。)
1
char数组在字符串上的优点是可以在适当位置更改字符数组;在C#中字符串是不可变的,所以任何更改都会在堆上创建一个新的对象,并使用该字符串的更改版本。在一个char数组中,你可以做很多修改而不需要在堆上分配任何东西。
相关问题
- 1. 类型从一个字符串数组
- 2. 数组C++字符串类型
- 3. .NET方法来解析字符串与长类型限定符
- 4. 字段类型字符串与字符串
- 5. 如何从字符串“string []”获取.NET数组类型?
- 6. 字符串数组与字符串与外部参数
- 7. WCF操作参数字符串与.Net类型(最佳实践)
- 8. “无法下标类型的值‘[字符串]’与类型的索引‘字符串’
- 9. 字符串数组分类
- 10. 与字符串和数组
- 11. strcpy与字符串数组
- 12. 字符串类型
- 13. 字符串类型
- 14. 字符串数组中的字符串
- 15. 字符串的字符数组和字符数组至字符串转换
- 16. OracleParameterCollection.Add(字符串,类型,字符串,大小,字符串)
- 17. 字符串字符串Clob类型的字符太长
- 18. RDD [数组[字符串]]与RDD [字符串]的计数速度
- 19. MongoDB字符串类型字段搜索匹配字符串数组
- 20. C#,.NET,字符串类
- 21. C#将字节数组与字符串转换为字符串
- 22. 类型'一维数组的字符串'的值不能转换为'字符串'
- 23. Java字符串类型的数组或简单的字符串使用
- 24. 无符号字符数组到宽字符数组/字符串
- 25. 查找字符串的字符串数组与GLib的
- 26. “[[字符串]”到期望的参数类型“[字符串]”
- 27. (字符串)字符类型转换
- 28. 字符串类型与abap中的char
- 29. 类型为字符串或数字
- 30. 比较与另一个字符串数组中的字符串
有性能增益与字符串在内存方面因为所有的字符串都被拦截。 – koumides
@koumides只有你明确被监听的字符串和字符串被限制。 – CodesInChaos