String.Contains()比String.IndexOf()更快吗?
我有一个约2000字符的string缓冲区,需要检查缓冲区是否包含特定的string。
将在每个webrequest的ASP.NET 2.0 webapp中进行检查。
有谁知道如果String.Contains方法执行比String.IndexOf方法更好?
// 2000 characters in s1, search token in s2 string s1 = "Many characters. The quick brown fox jumps over the lazy dog"; string s2 = "fox"; bool b; b = s1.Contains(s2); int i; i = s1.IndexOf(s2);
有趣的事实
Contains
调用IndexOf
:
public bool Contains(string value) { return (this.IndexOf(value, StringComparison.Ordinal) >= 0); }
其中调用CompareInfo.IndexOf
,它最终使用CLR实现。
如果您想查看CLR中的string是如何比较的, 则会显示给您 (请查找CaseInsensitiveCompHelper )。
IndexOf(string)
没有选项, Contains()
使用Ordinal比较(逐字节比较,而不是尝试执行智能比较,例如,e与é)。
所以IndexOf
会比理论上快一些,因为IndexOf
直接使用kernel32.dll中的FindNLSString进行stringsearch(reflectionfunction!)。
.NET 4.0更新 – IndexOf不再使用Ordinal比较,因此Contains可以更快。 见下面的评论。
也许,这根本就不重要。 阅读这篇文章编码恐怖;): http : //www.codinghorror.com/blog/archives/001218.html
包含(s2)很多次(在我的电脑中10次)比IndexOf(s2)快,因为Contains使用StringComparison.Ordinal比默认情况下IndexOf默认的文化敏感search更快(但可能会改变.net 4.0 http: //davebox.com/archive/2008/11/12/breaking-changes-to-the-string-class.aspx )。
包含的性能与我的testing中的IndexOf(s2,StringComparison.Ordinal)> = 0的性能完全相同,但它更短,使您的意图更清晰。
通过使用Reflector,您可以看到,Contains是使用IndexOf实现的。 这是实施。
public bool Contains(string value) { return (this.IndexOf(value, StringComparison.Ordinal) >= 0); }
所以Contains可能比直接调用IndexOf要慢一点,但是我怀疑它对实际性能有什么意义。
我正在运行一个真实的案例(与综合基准相反)
if("=,<=,=>,<>,<,>,!=,==,".IndexOf(tmps)>=0) {
与
if("=,<=,=>,<>,<,>,!=,==,".Contains(tmps)) {
这是我的系统的重要组成部分,它执行131,953次(感谢DotTrace)。
然而令人震惊的是,结果却与预期相反
- IndexOf 533ms。
- 包含266ms。
: – /
net framework 4.0(更新于2012年12月13日)
如果你真的想微观优化你的代码,你最好的办法是总是基准。
.net框架有一个很好的秒表实现 – System.Diagnostics.Stopwatch
就像这个更新一样,我一直在做一些testing,并提供你的inputstring是相当大的,那么并行正则expression式是我find的最快的C#方法(假设你有一个以上的核心)
获取总量的比赛例如 –
needles.AsParallel ( ).Sum ( l => Regex.IsMatch ( haystack , Regex.Escape ( l ) ) ? 1 : 0 );
希望这可以帮助!
从一点点阅读,看来在引擎盖下,String.Contains方法只是简单地调用String.IndexOf。 不同的是String.Contains返回一个布尔值,而String.IndexOf返回一个整数(-1),表示子string没有find。
我会build议用10万次左右的迭代来写一点testing,然后自己去看看。 如果我猜测,我会说IndexOf可能会稍微快一点,但就像我说的那样,只是一个猜测。
杰夫·阿特伍德(Jeff Atwood)在他的博客上有一篇关于string的好文 这更多关于连接,但可能有帮助。
使用一个基准库,就像Jon Skeet最近进行的测量一样。
买者自负
作为所有(微)性能问题,这取决于您使用的软件版本,检查数据的细节以及围绕该调用的代码。
作为所有(微)性能问题,第一步必须是获得易于维护的运行版本。 然后,可以将基准testing,分析和调整应用于测量的瓶颈,而不是猜测。
对于还在阅读的人来说,indexOf()可能会在大多数企业系统上performance得更好,因为contains()与IE不兼容!