我正面临一个困境。
我正在解析一个字符串,可以执行

s.matches(regex)

或者我可以做
s.startsWith(..) && s.endsWith(..)

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

最佳答案

这是一个非常粗略的基准,可以为您提供一个想法。使其适应您的用例,从而为您提供更多相关的结果。 startsWith和endsWith快得多。 1000000次运行后的结果:

未编译的模式1091ms

编译模式745ms

startsWith/endWith 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));

}

}

10-06 07:30
查看更多