使用正则表达式是否比IndexOf更快?

13

我有一个正在运行的应用程序,它查看队列中的项目,然后根据某些关键字应用类别,然后将其插入数据库。

我使用IndexOf来确定是否存在某个关键字。

这是最理想的方式还是使用正则表达式更快?

大约每秒处理10个项目左右。


6
你应该尝试两种方法并测量哪个更快。此外,每秒10次并不算什么,你不必在这里担心性能。 - ken2k
2
此外,我们需要了解解析的相对复杂度。如果您需要调用String.IndexOf 10次才能实现与RegEx相同的效果,则性能比率将与1对1不同。 - Chris Shain
1
每秒10个项目算什么?那你什么时候才开始关心性能呢? - Jack Marchetti
9个回答

19

仅仅查找一个关键字,使用 IndexOf 方法比使用正则表达式更快。正则表达式功能强大,但它们的优势在于灵活性,而不是原始速度。在简单字符串操作方面,它们无法超越字符串方法。

无论如何,如果字符串不是很长,这并不重要,因为你不需要经常执行该操作。


14

3

要确定最佳方案,唯一的方法是进行测试。但是如果做出一个有根据的猜测,那么取决于您正在测试的关键字数量、文本长度等因素。IndexOf 可能会更胜一筹。

要确保最佳解决方案,请为您特定的情况编写测试。


2

我怀疑这个 - indexOf 是一个非常简单的算法,只会在你的字符串中查找并返回它找到的第一次出现。

正则表达式是一种更复杂的机制,需要解析并针对整个字符串进行检查。如果你的字符串非常大,使用indexOf会更好。


1

正则表达式在较长的字符串中确实更快。

我的例子:搜索364kB文件内容中的字符串“<product ”。起始点被移动以查找下一个,然后是下一个,以此类推。但是,在整个值中未找到搜索的字符串。

我使用了三个测试命令:

         i = value.IndexOf("<" & tag & " ", xstart)

         i = value.IndexOf("<" & tag & " ", xstart, StringComparison.Ordinal)

         i = Regex.IsMatch(value.Substring(xstart), "<" & tag & " ", RegexOptions.Singleline)

指令一(标准 indexof)需要大约 7500 毫秒来搜索字符串 指令二(使用序数的 indexof)只需约 300 毫秒! 指令三(正则表达式)需要约 650 毫秒(IgnoreCase 选项为 ~1000 毫秒)。


1
首先,每秒处理10个条目,您可能根本不需要考虑性能。
在大多数情况下,IndexOf 比正则表达式更快。尤其是如果您不使用预编译的正则表达式。
它的性能还取决于所选择的字符串比较/区域设置。我期望 StringComparison.Ordinal 是最快的。

1
为什么不使用System.Diagnostics.Stopwatch类进行实验和测量经过的时间呢?http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx 在进行indexOf操作之前设置一个Stopwatch对象,然后在操作之后测量经过的时间。然后,将indexOf替换为正则表达式。最后,向我们报告您的发现,以便我们也能看到!

1

至少这位程序员发现使用IndexOf的代码更容易理解和快速!

节省一点CPU时间是否值得让下一个人花费更多时间来理解代码呢?


1
一个正则表达式,用于查找第一次出现的字符串以模拟 indexOf,如果程序员想要理解它,不会给他带来严重的麻烦。 - F.P
@FlorianPeschka,费用确实很低,但查看正则表达式仍然需要付出一定的代价。 - Ian Ringrose
1
RegEx.Match 很难理解吗? - Jack Marchetti
1
如果正则表达式难以理解,那么开发人员需要学习一些。这就像一个机械师会说十六进制键很难使用,所以他们会使用其他工具代替。学习你的专业工具。没有任何借口。 - Robert Koritnik

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接