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不兼容!