我有一个大约2000个字符的字符串缓冲区,如果它包含一个特定的字符串,需要检查缓冲区.
将针对每个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中比较字符串,这将显示(查找CaseInsensitiveCompHelper).
IndexOf(string)
没有选项并Contains()
使用序数比较(逐字节比较,而不是尝试执行智能比较,例如,e与é).
因此,使用来自kernel32.dll的FindNLSString(反射器的强大功能IndexOf
)IndexOf
直接进行字符串搜索会稍微快一些(理论上).
针对.NET 4.0进行了更新 - IndexOf不再使用Ordinal Comparison,因此Contains可以更快.见下面的评论.
可能根本不重要.阅读关于Coding Horror的这篇文章;):http://www.codinghorror.com/blog/archives/001218.html
包含(s2)很多次(在我的计算机中10次)比IndexOf(s2)快,因为Contains使用的StringComparison.Ordinal比IndexOf默认执行的文化敏感搜索更快(但可能会在.net 4.0中更改http: //davesbox.com/archive/2008/11/12/breaking-changes-to-the-string-class.aspx).
Contains在我的测试中具有与IndexOf(s2,StringComparison.Ordinal)> = 0完全相同的性能,但它更短并且使你的意图清晰.
我正在运行一个真实案例(与合成基准相反)
if("=,<=,=>,<>,<,>,!=,==,".IndexOf(tmps)>=0) {
与
if("=,<=,=>,<>,<,>,!=,==,".Contains(tmps)) {
它是我系统的重要组成部分,执行时间为131,953次(感谢DotTrace).
然而令人震惊的惊喜,结果是预期相反
IndexOf 533ms.
包含266ms.
: - /
net framework 4.0(更新时间为2012年2月13日)
通过使用Reflector,您可以看到,Contains是使用IndexOf实现的.这是实施.
public bool Contains(string value) { return (this.IndexOf(value, StringComparison.Ordinal) >= 0); }
所以Contains可能比直接调用IndexOf慢一点,但我怀疑它对实际性能有任何意义.
如果您真的想要微观优化代码,那么最好的方法就是始终进行基准测试.
.net框架有一个很好的秒表实现--System.Diagnostics.Stopwatch