String.Contains 如何工作? [复制]

2023-12-31

可能的重复:
.Net 使用什么算法来搜索字符串中的模式? https://stackoverflow.com/questions/2584169/what-algorithm-net-use-for-searching-a-pattern-in-a-string

我的程序中有一个循环从文件中获取一行。然后检查该行是否包含字符串

if(line.Contains("String"))
{
    //Do other stuff
}

文件中有超过 200 万行,因此如果我可以将速度加快 1/10 毫秒,那么每次运行都会节省超过 3 分钟的时间。

那么...假设一行有 1000 个字符长,查找短字符串或长字符串是否更快,或者没有区别?

line.Contains("ABCDEFGHIJKLMNOPQRSTUVWXYZ");

or

line.Contains("ABCDEFG")

先感谢您。


String.Contains() 遵循一条曲折的路线,通过 System.Globalization.CompareInfo 进入 CLR 和 NLS 支持子系统,在那里我完全迷失了方向。其中包含高度优化的代码,具有令人印象深刻的性能。更快的唯一方法是通过 pinvoking 标准 CRT 函数 wcssstr(可在 msvcrt.dll 中找到)

    [DllImport("msvcrt.dll", CharSet = CharSet.Unicode)]
    private static extern IntPtr wcsstr(string toSearch, string toFind);

如果未找到该字符串,则返回 IntPtr.Zero。我做了一些测量,使用 String.IndexOf() 而不是 Contains() 来测试各种字符串比较选项。所有时间均以纳秒为单位,在 60 个字符的字符串中搜索 7 个字符的字符串。由于字符串不存在,因此测量最坏的情况。使用 20 个样本中的最短时间:

StringComparison.Ordinal (same as Contains) : 245 nanoseconds
StringComparison.OrdinalIgnoreCase : 327
StringComparison.InvariantCulture : 251
StringComparison.InvariantCultureIgnoreCase : 327
StringComparison.CurrentCulture : 275
StringComparison.CurrentCultureIgnoreCase : 340
wcsstr : 213

非常令人印象深刻的数字,与您期望的这些功能的要求相当。 wcssstr() 函数执行与 String.Compare() 相同类型的序数比较。它只快了 13%,考虑到由于 CPU 缓存局部性的影响,实际性能不太可能接近这些测量结果,因此统计上的改进并不显着。我只能得出结论,你的速度正如你所期望的那样快。 wcssstr 的微小改进是否值得取决于您。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

String.Contains 如何工作? [复制] 的相关文章

随机推荐