Java 当我对主机的ping小于1ms时,http GET请求需要1到3秒的时间,这是否正常?
我正在编写一个java应用程序,它在执行http GET请求时需要非常高效 我正在使用netbeans概要文件特性,它让我可以测量性能,到目前为止,我已经尝试了两个库:java默认库和okhttp 我注意到,对于每个请求,从开始构建url并执行连接到接收响应代码之间需要1到3秒的时间。这不是有点太多了吗?另外,请注意,我的电脑和主机之间的ping少于1毫秒。openConnection()/execute()方法怎么会花这么长时间?这是正常的吗?我怎样才能让它更快 这就是我使用okhttp的方式。OkHttpClient客户端仅在启动应用程序时创建一次Java 当我对主机的ping小于1ms时,http GET请求需要1到3秒的时间,这是否正常?,java,http,netbeans,okhttp,Java,Http,Netbeans,Okhttp,我正在编写一个java应用程序,它在执行http GET请求时需要非常高效 我正在使用netbeans概要文件特性,它让我可以测量性能,到目前为止,我已经尝试了两个库:java默认库和okhttp 我注意到,对于每个请求,从开始构建url并执行连接到接收响应代码之间需要1到3秒的时间。这不是有点太多了吗?另外,请注意,我的电脑和主机之间的ping少于1毫秒。openConnection()/execute()方法怎么会花这么长时间?这是正常的吗?我怎样才能让它更快 这就是我使用okhttp的方式
Request request = new Request.Builder()
.url(url)
.build();
try {
Response response = client.newCall(request).execute();
jresp = new JSONObject(response.body().string());
response.close();
} catch (Exception ex) {
ex.printStackTrace();
}
这是使用java默认库的版本
try {
StringBuilder result = new StringBuilder();
URL url = new URL(buyUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
BufferedReader rd;
int code = conn.getResponseCode();
if (code == 200) {
rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
} else {
rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
}
String line;
while ((line = rd.readLine()) != null) {
result.append(line);
}
rd.close();
jresp = new JSONObject(result.toString());
} catch (Exception ex) {
ex.printStackTrace();
}
正如我所说,这两种方法平均需要相同的时间,在1000到3000毫秒之间,使用或使用Zipkin之类的库实现跟踪,以了解为什么在所有级别都需要时间
如果无法访问您的网络或服务器,我无法详细回答您的具体情况
这是一个示例OkHttp请求
它慢的原因
- 包括从http到https的重定向
- 进行两次DNS查找(可能会慢得多)
- 创建两个TCP套接字(与我们连接到的位置相关)
- 1 TLS握手吗
- 谷歌从重定向到
- 传输响应数据速度慢(4x)
- 知道第一次击中终点
- 重用现有的HTTP/2连接
这完全取决于您如何处理请求。请发布您的代码。这还取决于服务器需要做什么来生成响应。如果服务器速度慢,你就什么也做不了。我建议使用Curl和/或WireShark之类的工具来跟踪请求。如果这是服务器端的问题,您就无能为力了。您可以有一个快速的ping时间,但服务器可能正在执行一个缓慢的查询。我看到服务器需要几分钟来响应get请求!您还可以在代码中添加一些带有时间戳的日志记录,以查看到底是什么花费了这么长的时间。这有太多不同的可能性和原因,因此对于这个站点来说太广泛了。原始帖子中添加的代码我已经尝试过了,但当我单击“查找跟踪”时,它什么也没有显示。这只是一个示例,如果你想使用Zipkin,你需要实现你自己的跟踪,例如,打印事件可能更简单,例如,EventListener非常有用,并且易于使用。第一次连接比其他连接需要更多的时间,因为需要握手。其他的仍然需要至少一秒钟,但这是因为服务器需要一些时间来发送响应体(即使响应体相对较小)。connectionAcquired和requestHeaders回调在几毫秒内执行,因此我的问题得到了解决。非常感谢您的帮助。最后一件事,如果在一定时间内(比如5分钟)没有任何请求,那么发出的第一个请求需要大约100毫秒才能获得连接。如果在这个请求之后很快又有另一个请求,那么一切都会回到“正常”状态,并在2-3毫秒内获得连接。我如何确保连接始终在3毫秒内建立?我是否应该执行中间请求,即使不是为了使连接保持活动状态?