假设我有 60 个单词,我想检查输入是否是这些单词中的任何一个
哪个更快:
1) 制作一个正则表达式并对其中的单词进行 ORing
2) 在数组上循环并搜索?
最佳答案
您可以自己轻松测试。出于好奇,我创建了一个 test case四种不同的场景:
Pattern.matcher().matches()
带有按需Pattern
实例(为每次运行创建)Pattern.matcher().matches()
带有缓存的Pattern
实例(在所有运行之前创建)String.equals()
针对数组中的每个元素,在循环中执行Set.contains()
在缓存的Set
上(在所有运行之前创建)
数据集:输入数组包含 6000 个随机生成的字符串,每个字符串包含 6 个字符。每个测试执行 10,000 次,对所有运行的结果求和并取平均值。
结果(所有时间均以毫秒为单位 - 越低显然越好)。第一个数字是所有 10,000 次运行的总执行时间,第二个数字是每次运行的平均值:
On-Demand Regex: 12934 (1.29 avg)
Pre-compile Regex: 458 (0.05 avg)
Loop: 77 (0.01 avg)
Set.contains: 4 (0.00 avg)
长话短说:如果您要使用正则表达式(您不应该这样做),至少要创建并缓存 Pattern
。但假设性能很重要,如果您提前知道单词列表,您就不会击败 Set.contains()
。
注意 按需正则表达式测试包括构造提供给 Pattern.compile()
方法的 StringBuilder
实例的成本,所以不一定所有的额外时间都花在正则表达式编译上。 Set.contains
测试还有一个小小的优势,那就是它是内联的,并且避免了方法调用的额外堆栈创建。我修改了测试,让它在一个单独的方法中执行,但这并没有对结果产生实质性影响。
关于java - 正则表达式匹配或数组搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23331359/