首页 > 解决方案 > Java 读取 HTTP 响应(使用 StringBuilder)比在 python 中慢得多

问题描述

我正在调用一个返回大响应的 Web 服务,大约 59 兆字节的数据。这就是我从 Java 中读取它的方式:

        BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
        result = result.concat(this.getResponseText(in));

private String getResponseText(BufferedReader in) throws IOException {
    StringBuilder response = new StringBuilder(Integer.MAX_VALUE/2);

    System.out.println("Started reading");
    String line = "";
    while((line = in.readLine()) != null) {
        response.append(line);
        response.append("\n");
    }

    in.close();

    System.out.println("Done");
    String r = response.toString();
    System.out.println("Built r");

    return r;
}

在阅读过程中,在 Windows 资源管理器中,我可以看到每秒大约 100000 字节的吞吐量。

但是,当我从 python 中的同一个 web 服务中读取完全相同的数据时,即:

response = requests.request("POST", url, headers=headers, verify=False, json=json)

我可以看到高达每秒 700000 字节的吞吐量(大约快 7 倍)。而且代码完成的速度也快了 7 倍。

问题是 - 我是否遗漏了一些可以使 Java 读取速度更快的东西?这种方式真的是我在 Java 中读取 HTTP 响应的最快方式吗?

更新 - 即使我没有阅读,只是通过响应,我仍然最多 100000 字节/秒,所以我相信瓶颈在 Java 读取方式的某个地方:

private List<String> getResponseTextAsList(BufferedReader in) throws IOException {
    System.out.println("Started reading");

    List<String> l = new ArrayList<String>();
    int i = 0;
    long q = 0;
    String line = "";
    while((line = in.readLine()) != null) {
        //l.add(line);
        i++;
        q = q+line.length();
    }

    in.close();

    System.out.println("Done" + i + " " + q);

    return l;
}

标签: javapythonperformancehttpstringbuilder

解决方案


推荐阅读