Java读取HTTP响应(使用StringBuilder)比python慢得多
我正在调用一个Web服务,它返回一个大响应,大约59兆字节的数据。 以下是我从Java中阅读它的方式:Java读取HTTP响应(使用StringBuilder)比python慢得多,java,python,performance,http,stringbuilder,Java,Python,Performance,Http,Stringbuilder,我正在调用一个Web服务,它返回一个大响应,大约59兆字节的数据。 以下是我从Java中阅读它的方式: BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8")); result = result.concat(this.getResponseText(in)); private String getResponseText(Buffer
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;
}
私有列表getResponseTextAsList(BufferedReader in)引发IOException{
System.out.println(“开始读取”);
列表l=新的ArrayList();
int i=0;
长q=0;
字符串行=”;
而((line=in.readLine())!=null){
//l、 添加(行);
i++;
q=q+line.length();
}
in.close();
System.out.println(“完成”+i+“”+q);
返回l;
}
我不确定您的具体问题是什么。但我可以证实,许多(并非所有)任务可以比Java运行得更快,代码也要少得多。具体的问题是——我用Java阅读它的方式真的是最好、最快的方式吗?你应该编辑你的问题。这可能取决于数据包到达的速度吗?使用Windows资源管理器您是如何对此进行分析的(多少次,什么控制)?Java也有一个很慢的开始,Python没有。我打赌你不需要将它作为一个巨大的字符串返回。无论您在响应体上执行什么处理,都要分块执行(例如一次一行)。