为什么Java8的JSON lib速度比Java6慢4倍
我发现在Java8上解析大型json文件比Java6慢4倍 我在Linux 64位机器上进行了测试 您可以从下载包含所需jar文件的现成运行代码 以下是源代码:为什么Java8的JSON lib速度比Java6慢4倍,java,json,Java,Json,我发现在Java8上解析大型json文件比Java6慢4倍 我在Linux 64位机器上进行了测试 您可以从下载包含所需jar文件的现成运行代码 以下是源代码: import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.InputStream; import net.sf.json.JSONObject; public class JsonLib { public sta
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import net.sf.json.JSONObject;
public class JsonLib {
public static void main(String [] args) throws Exception {
String sampleJsonPath = "sample.json";
byte [] b = new byte[2048];
int totalRuns = 50;
if (args.length > 0) {
totalRuns = Integer.parseInt(args[0]);
}
int len;
ByteArrayOutputStream bop = new ByteArrayOutputStream(8192);
InputStream ip = new FileInputStream(sampleJsonPath);
while ((len = ip.read(b)) > 0) {
bop.write(b, 0, len);
}
ip.close();
String countryJson = new String(bop.toByteArray());
long start = System.currentTimeMillis();
long runStart = start;
long runEnd;
for (int i = 0; i < totalRuns;) {
JSONObject.fromObject(countryJson);
i++;
if (i % 10 == 0) {
runEnd = System.currentTimeMillis();
System.out.println("PARSE TIME for run " + (i-10) + '-' + i + " = " + (runEnd - runStart));
runStart = runEnd;
}
}
long end = System.currentTimeMillis();
System.out.println("Total time = " + (end -start));
}
}
import java.io.ByteArrayOutputStream;
导入java.io.FileInputStream;
导入java.io.InputStream;
导入net.sf.json.JSONObject;
公共类JsonLib{
公共静态void main(字符串[]args)引发异常{
字符串sampleJsonPath=“sample.json”;
字节[]b=新字节[2048];
int totalRuns=50;
如果(args.length>0){
totalRuns=Integer.parseInt(args[0]);
}
内伦;
ByteArrayOutputStream bop=新ByteArrayOutputStream(8192);
InputStream ip=新文件InputStream(sampleJsonPath);
而((len=ip.read(b))>0){
bop写入(b,0,len);
}
ip.close();
String countryJson=新字符串(bop.toByteArray());
长启动=System.currentTimeMillis();
长时间运行启动=启动;
长流道;
对于(int i=0;i
代码对一个大型json文件进行50次解析,每10次打印一次时间
Java6大约需要1.5秒,而Java8需要7秒
在我的公司,我们通过迁移到jackson parser解决了这个问题
但是,如果有人能更清楚地说明在这种情况下Java 8速度缓慢的原因,那就太好了。在这个问题上运行一个探查器(NetBeans,VisualVM,…),它应该向您显示时间损失的位置。
字符串的实现更改可能会导致时间损失,其中substring
现在复制备份char[]
。因为要对字节数组进行字符串化,所以要给JSONObject
一个非常大的字符串。在Java6中,该字符串的子字符串将共享char[]
。在Java8中,子字符串复制相关部分。如果您改为使用JSONTokener
创建JSONObject
,性能可能类似。@Andreas?@Marged谢谢。我从未看过关于这个主题的文章,我只是注意到调试器中的更改。感谢您的快速响应。String.substring实现的变化似乎是根本原因,因为我在Java 7中也看到了类似的缓慢。