gpt4 book ai didi

c# - C#中的快速字符串解析

转载 作者:太空狗 更新时间:2023-10-29 21:52:13 26 4
gpt4 key购买 nike

在 C# 中解析字符串的最快方法是什么?

目前我只是使用字符串索引(string[index])并且代码运行合理,但我不禁认为索引访问器所做的连续范围检查必须是添加一些东西。

所以,我想知道我应该考虑使用哪些技术来提升它。这些是我最初的想法/问题:

  1. 使用string.IndexOf()IndexOfAny() 等方法查找感兴趣的字符。这些是否比通过 string[index] 手动扫描字符串更快?
  2. 使用正则表达式。就我个人而言,我不喜欢正则表达式,因为我发现它们难以维护,但它们是否可能比手动扫描字符串更快?
  3. 使用不安全的代码和指针。这将消除索引范围检查,但我读到不安全的代码不会在不受信任的环境中运行。这到底意味着什么?这是否意味着整个程序集不会加载/运行,或者只有标记为不安全的代码会拒绝运行?该库可能会在多种环境中使用,因此能够回退到速度较慢但更兼容的模式会很好。
  4. 我还可以考虑什么?

注意:我应该说,我正在解析的字符串可能相当大(比如 30k)并且采用没有标准 .NET 解析器的自定义格式。此外,这段代码的性能并不是非常关键,所以这在一定程度上只是一个出于好奇的理论问题。

最佳答案

30k 不是我认为的大。在兴奋之前,我会介绍一下。索引器应该能够很好地平衡灵 active 和安全性。

例如,要创建一个 128k 的字符串(和一个相同大小的单独数组),用垃圾填充它(包括处理 Random 的时间)并通过以下方式对所有字符代码点求和索引器需要... 3 毫秒:

        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();

对于实际上很大的文件,应该使用阅读器方法——StreamReader

关于c# - C#中的快速字符串解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3157674/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com