使用正则表达式的速度比IndexOf快
本文关键字:IndexOf 速度 正则表达式 | 更新日期: 2023-09-27 18:25:22
我运行了一个应用程序,它会查看队列中的项目,然后根据某些关键字应用一个类别,然后将其插入数据库。
我正在使用IndexOf来确定是否存在某个关键字。
这是理想的方式还是RegEX更快?
每秒大约有10个项目被处理。
对于只查找关键字,IndexOf
方法比使用正则表达式更快。正则表达式很强大,但它们的强大之处在于灵活性,而不是原始速度。它们不会在简单的字符串操作中胜过字符串方法。
不管怎样,如果字符串不是很大,那就不重要了,因为你不经常这样做。
http://ayende.com/blog/2930/regex-vs-string-indexof
这似乎与绳子的长度和效率有关。
你唯一确定的方法是测试它。但做出有根据的猜测取决于你测试的关键词数量、文本长度等。indexOf可能会获胜。
你唯一确定的方法是为你的特定场景写一个测试。
我对此表示怀疑-indexOf
是一个非常简单的算法,它只会搜索字符串并返回它找到的第一个匹配项。
Regex是一种复杂得多的机制,需要对整个字符串进行解析和检查。如果你的字符串很大,最好使用indexOf。
首先,每秒有10个项目,您可能甚至不需要思考性能。
在大多数情况下,IndexOf
可能比regex更快。特别是如果您不使用预编译的regex。
它的性能也可能取决于所选择的字符串比较/区域性。我希望StringComparison.Ordinal
是最快的。
为什么不使用System.Diagnostics.Stopwatch类进行实验并测量所用时间?http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx
在indexOf操作之前设置一个Stopwatch对象,然后测量它之后经过的时间。然后,将indexOf换成正则表达式。最后,报告您的发现,以便我们也能看到它们!
至少这个程序员发现它能更快地理解使用IndexOf的代码!
节省一点CPU时间是否有理由延长下一个人理解代码的时间?
正则表达式在较长字符串中更快似乎是正确的。我的例子是:在364kB的文件内容中搜索字符串"<产品";。移动起点以查找下一个和下一个,依此类推。但是,在整个值中找不到搜索到的字符串。
我使用了三个测试命令:
i = value.IndexOf("<" & tag & " ", xstart)
i = value.IndexOf("<" & tag & " ", xstart, StringComparison.Ordinal)
i = Regex.IsMatch(value.Substring(xstart), "<" & tag & " ", RegexOptions.Singleline)
命令一(标准索引)需要~7500毫秒来搜索字符串命令二(带序数的indexof)需要~300毫秒!命令三(regex)需要约650毫秒(使用IgnoreCase选项约1000毫秒)。
您可以在这个链接上找到关于这个查询的信息:http://ayende.com/blog/2930/regex-vs-string-indexof
总之,这似乎表明,搜索模式越大,RegEx的相对性能越好。