我正面临两难选择。 我正在解析一个字符串,可以做
s.matches(regex)
或者我可以做到
s.startsWith(..) && s.endsWith(..)
正如您已经意识到的那样,它不是一个复杂的正则表达式,两种情况都会起作用。 这个想法是,字符串可能很长(数百个字符),所以我希望最大化效率。 哪种方式更适合这个问题?
答案 0 :(得分:6)
这是一个非常粗略的基准,可以给你一个想法。根据您的用例进行调整,以获得更相关的结果。 startsWith和endsWith更快。 1000000次运行后的结果:
未编译的模式1091ms
编译模式745ms
startsWith / endsWith 24ms
public class TestRegex {
String regex = "^start.*end$";
Pattern p = Pattern.compile(regex);
String start = "start";
String end = "end";
String search = start + "fewbjlhfgljghfadsjhfdsaglfdhjgahfgfjkhgfdkhjsagafdskghjafdkhjgfadskhjgfdsakhjgfdaskhjgafdskjhgafdsjhkgfads" +end;
int runs = 1000000;
@Test
public final void test() {
//init run
for (int i=0;i<runs;i++)
search.matches(regex);
for (int i=0;i<runs;i++)
p.matcher(search).matches();
for (int i=0;i<runs;i++){
search.startsWith(start);
search.endsWith(end);
}
//timed run;
Stopwatch s = Stopwatch.createStarted();
for (int i=0;i<runs;i++)
search.matches(regex);
System.out.println(s.elapsed(TimeUnit.MILLISECONDS));
s.reset(); s.start();
for (int i=0;i<runs;i++)
p.matcher(search).matches();
System.out.println(s.elapsed(TimeUnit.MILLISECONDS));
s.reset(); s.start();
for (int i=0;i<runs;i++){
search.startsWith(start);
search.endsWith(end);
}
System.out.println(s.elapsed(TimeUnit.MILLISECONDS));
}
}
答案 1 :(得分:5)
请注意,如果结尾处填充的字符串是起始字符串的后缀,则两种方法都可能会报告不同的结果:
^start.*art$
不匹配
"start"
,而
"start".startsWith("start") && "start".endsWith("art")
将是真的。
答案 2 :(得分:1)
实际上,对于小字符串来说存在差异并且显而易见。 使用模式编译正则表达式的版本确实可以进行一些增强,但毫无疑问,当匹配很容易时,这是最糟糕的想法。
谢谢大家。