gpt4 book ai didi

java - Pattern.split 比 String.split 慢

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:20:32 29 4
gpt4 key购买 nike

有两种方法:

private static void normalSplit(String base){
base.split("\\.");
}

private static final Pattern p = Pattern.compile("\\.");

private static void patternSplit(String base){
//use the static field above
p.split(base);

}

然后我在 main 方法中像这样测试它们:

public static void main(String[] args) throws Exception{
long start = System.currentTimeMillis();
String longstr = "a.b.c.d.e.f.g.h.i.j";//use any long string you like
for(int i=0;i<300000;i++){
normalSplit(longstr);//switch to patternSplit to see the difference
}
System.out.println((System.currentTimeMillis()-start)/1000.0);
}

直觉上,我认为 String.split 最终会调用 Pattern.compile.split(经过大量额外工作)来完成真正的事情。我可以提前构造 Pattern 对象(它是线程安全的)并加速拆分。

但事实是,使用预先构建的 Pattern 比直接调用 String.split 慢得多。我在它们上尝试了一个 50 个字符长的字符串(使用 MyEclipse),直接调用只消耗了使用预先构造的 Pattern 对象的一半时间。

有人能告诉我为什么会这样吗?

最佳答案

这可能取决于Java的实际实现。我使用的是 OpenJDK 7,在这里,String.split 确实会调用 Pattern.compile(regex).split(this, limit),但仅当 要分割的字符串 regex 不止是一个字符。

参见 here对于源代码,第 2312 行。

public String[] split(String regex, int limit) {
/* fastpath if the regex is a
(1)one-char String and this character is not one of the
RegEx's meta characters ".$|()[{^?*+\\", or
(2)two-char String and the first char is the backslash and
the second is not the ascii digit or ascii letter.
*/
char ch = 0;
if (((regex.count == 1 &&
// a bunch of other checks and lots of low-level code
return list.subList(0, resultSize).toArray(result);
}
return Pattern.compile(regex).split(this, limit);
}

当您按 "\\." 拆分时,它使用的是“快速路径”。也就是说,如果您正在使用 OpenJDK。

关于java - Pattern.split 比 String.split 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29393086/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com