Java分割字符串性能
以下是我的应用程序中的当前代码:
String[] ids = str.split("/");
在分析应用程序时,字符串拆分将花费不可忽略的时间。另外,split
方法采用正则表达式,这在这里是多余的
我可以使用什么替代方法来优化字符串拆分?{
(我会自己尝试和测试,但分析我的应用程序需要很多时间。)
你可以在下面搜索框中键入要查询的问题!
以下是我的应用程序中的当前代码:
String[] ids = str.split("/");
在分析应用程序时,字符串拆分将花费不可忽略的时间。另外,split
方法采用正则表达式,这在这里是多余的
我可以使用什么替代方法来优化字符串拆分?{
(我会自己尝试和测试,但分析我的应用程序需要很多时间。)
# 1 楼答案
如果可以使用第三方库,Guava's^{} 在不需要正则表达式时,不会产生正则表达式的开销,而且一般来说速度非常快。(披露:我为番石榴捐款。)
(而且,
Splitter
通常比String.split
更much more predictable。)# 2 楼答案
鉴于我正在大规模工作,我认为提供更多的基准测试会有所帮助,包括我自己的一些实现(我在空间上进行了划分,但这应该说明一般需要多长时间):
我正在处理一个426MB的文件,有2622761行。唯一的空白是普通空格(“”)和行(“\n”)
首先,我将所有行替换为空格,并对一条巨大的行进行基准分析:
然后,我对逐行拆分进行基准测试(这意味着函数和循环要多次执行,而不是一次全部执行):
以下是代码:
以下是我使用StringTokenizer的方式:
# 3 楼答案
^{} 对于像这样的简单解析来说要快得多(我之前做过一些基准测试,你得到了巨大的加速)
如果您想提高性能,也可以手动执行:
# 4 楼答案
Guava有一个Splitter方法,它比
String.split()
方法更灵活,并且(不一定)使用正则表达式。OTOH,String.split()
在Java7中进行了优化,以避免在分隔符是单个字符时使用正则表达式机制。因此,Java 7的性能应该类似# 5 楼答案
根据this post,速度大约是原来的两倍
然而,除非你的应用程序规模巨大,
split
对你来说应该没问题(c.f.同一篇文章,它在几毫秒内引用了数千个字符串)# 6 楼答案
如果模式只有一个字符长,那么}的速度不会快很多
String.split(String)
将不会创建regexp。当按单个字符拆分时,它将使用非常高效的专用代码^在这种特殊情况下,{这是在OpenJDK7/OracleJDK7中引入的Here's a bug report和a commit。我做了一个simple benchmark here