Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Java8的JSON lib速度比Java6慢4倍_Java_Json - Fatal编程技术网

为什么Java8的JSON lib速度比Java6慢4倍

为什么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

我发现在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 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中也看到了类似的缓慢。