在C#中解析字符串的最快方法是什么?
目前我只是使用字符串索引(string[index]
)并且代码运行合理,但我不禁想到索引访问器所做的连续范围检查必须添加一些内容。
所以,我想知道我应该考虑采用哪些技术来提升它。这些是我最初的想法/问题:
string.IndexOf()
和IndexOfAny()
等方法查找感兴趣的字符。这些比string[index]
手动扫描字符串更快吗?注意:我应该说,我正在解析的字符串可能相当大(比如30k),并且是自定义格式,没有标准的.NET解析器。此外,这段代码的表现并不是非常关键,所以这部分只是好奇心的理论问题。
答案 0 :(得分:2)
30k不是我认为的大。在兴奋之前,我会说。索引器应该很好,以实现灵活性和安全性的最佳平衡。
例如,要创建128k字符串(以及相同大小的单独数组),请使用垃圾填充(包括处理Random
的时间)并通过索引器将所有字符代码点相加...... 3ms:
var watch = Stopwatch.StartNew();
char[] chars = new char[128 * 1024];
Random rand = new Random(); // fill with junk
for (int i = 0; i < chars.Length; i++) chars[i] =
(char) ((int) 'a' + rand.Next(26));
int sum = 0;
string s = new string(chars);
int len = s.Length;
for(int i = 0 ; i < len ; i++)
{
sum += (int) chars[i];
}
watch.Stop();
Console.WriteLine(sum);
Console.WriteLine(watch.ElapsedMilliseconds + "ms");
Console.ReadLine();
对于实际大的文件,应使用 reader 方法 - StreamReader
等。
答案 1 :(得分:1)
“解析”是一个非常不精确的术语。因为你说的是30k,所以你可能正在处理某种结构化的字符串,可以通过使用解析器生成器工具创建解析器来解决这个问题。
创建,维护和理解整个过程的一个很好的工具是Devin Cook的GOLD解析系统:http://www.devincook.com/goldparser/
这可以帮助您创建有效且正确的代码,以满足许多文本解析需求。
关于你的观点:
通常对解析没有用,这比分割字符串更进一步。
更适合。
基本上是禁止的。 JIT可以仅在需要时处理范围检查,实际上对于简单的循环(典型的for
循环),这可以很好地处理。