假设我有60个单词,我想检查输入是否是这些单词中的任何一个
哪个更快:
1)制作正则表达式并对其中的单词进行OR运算
2)在数组上循环并搜索?
答案 0 :(得分: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()
。
注意按需正则表达式测试包括构造StringBuilder
方法的Pattern.compile()
实例的成本,因此不一定所有的额外时间都是花在正则表达式编译上。 Set.contains
测试也有一点点优势,因为它内联,并避免了方法调用的额外堆栈创建。我修改了测试,让它在一个单独的方法中执行,但它并没有对结果产生重大影响。