我已经注意到,如果第一次通过Java (URLConnection、Apache或OKHttp)调用api,需要花费更多的时间。对于随后的电话,时间要短得多。
虽然邮递员或curl.exe花费的时间非常少(与java的第二次迭代相比)

对我的机器来说,第一次的开销大约是2秒。但是在一些机器上,这是第一次上升到5-6秒左右。此后,往返时间约为300 ms。
下面是我的示例代码:
public static String DoPostUsingURLConnection(String s_uri) throws Exception {
try {
URL uri = new URL(s_uri);
HttpURLConnection connection = (HttpURLConnection) uri.openConnection();
// Logger.log("Opened Connection");
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/json");
connection.setDoOutput(true);
connection.setRequestProperty("Authorization", authorizationHeader);
// Create the Request Body
try (OutputStream os = connection.getOutputStream()) {
byte[] input = jsonRequestBody.getBytes("utf-8");
os.write(input, 0, input.length);
}
// Logger.log("Written Output Stream");
int responseCode = connection.getResponseCode();
InputStream is = null;
if (responseCode == HttpURLConnection.HTTP_OK)
is = connection.getInputStream();
else
is = connection.getErrorStream();
BufferedReader in = new BufferedReader(new InputStreamReader(is));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine).append("\n");
;
}
in.close();
return response.toString();
} catch (Exception ex) {
return ex.getMessage();
} finally {
// Logger.log("Got full response");
}发布于 2022-01-13 13:22:31
您可以通过记录OkHttp连接事件来调查所花费的时间。https://square.github.io/okhttp/events/
如果您正在获得一个IPv4地址和IPv6,而其中一个是超时,另一个是成功的,则这将特别重要。
发布于 2022-01-12 14:22:19
这只是猜测而已。但是Http连接的工作方式是,当您第一次调用它时,连接就建立了,这需要时间。在此之后,Http协议在一段时间内不会真正关闭连接,因为期望会有更多的请求出现,并且连接可以被重用。实际上,在您的情况下,您发送的后续请求重用先前创建的连接,而不是重新建立连接,这是扩展性的。我已经编写了自己的开源库,其中包含了一个简单的Http客户端。我注意到了同样的效果,第一次请求比随后的请求花费更长的时间。但这并不能解释为什么在邮递员和卷发中我们看不到同样的效果。无论如何,如果你想解决这个问题,而且你事先知道你的URL,在你的应用程序初始化时发送一个请求(你甚至可以在单独的线程中这样做)。这会解决你的问题。
如果您有兴趣看我的库,这里是Javadoc链接。您可以在github 这里和github 这里上找到它。关于这里部分特性列表的库的文章
https://stackoverflow.com/questions/70681962
复制相似问题