Java String解析,什么更快?正则表达式或字符串方法?

bud*_*123 5 java regex

我面临两难选择.我正在解析一个字符串,也可以

s.matches(regex)
Run Code Online (Sandbox Code Playgroud)

或者我能做到

s.startsWith(..) && s.endsWith(..)
Run Code Online (Sandbox Code Playgroud)

正如您已经意识到的那样,它不是一个复杂的正则表达式,并且这两种情况都可行.这个想法是,字符串可能很长(数百个字符),所以我希望最大化效率.什么有效,更适合这个问题?

tom*_*tom 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));

}

}
Run Code Online (Sandbox Code Playgroud)

  • +1 JIT将使用高度优化的汇编程序代码替换某些String方法; 有时,它们可以用单个CPU操作码替换. (3认同)

Ing*_*ngo 5

请注意,如果在末尾填充的字符串是起始字符串的后缀,则两种方法都可能会报告不同的结果:

^start.*art$
Run Code Online (Sandbox Code Playgroud)

不会匹配

"start"
Run Code Online (Sandbox Code Playgroud)

"start".startsWith("start") && "start".endsWith("art")
Run Code Online (Sandbox Code Playgroud)

将是真的.