我需要更好地衡量HTTP请求的详细时间(连接时间,到第一个字节的时间,传输时间)。
上下文: 我有一个小型Java应用程序(在AWS Lambda上运行),它正在调用第三方服务。 由于日志记录显示处理过程有很大的延迟,因此添加了一小段日志记录以更好地找出延迟发生的位置:
HttpPost request = new HttpPost("http://www.google.com");
HttpClient = HttpClientBuilder.create().build();
long startTime = System.currentTimeMillis();
HttpResponse baseResponse = internalClient.execute(request);
long duration = System.currentTimeMillis() - startTime;
虽然duration
注册了30秒,但提供者日志显示为1.5秒!
所以我想知道时间花在哪里?如何衡量?
更新:使用cURL可以获得的数据示例:https://blog.josephscott.org/2011/10/14/timing-details-with-curl/
答案 0 :(得分:0)
要精确测量Java使用时间nanoTime()
,请参阅文档System.nanoTime()中所述:
此方法只能用于测量经过的时间而不是 与系统或挂钟时间的任何其他概念有关。价值 返回表示自某些固定但任意来源以来的纳秒 时间(也许在将来,所以价值可能是负面的)。相同 在a的实例中,此方法的所有调用都使用origin Java虚拟机;其他虚拟机实例很可能 使用不同的来源。
请注意,如果您需要比较不同线程中的调用之间经过的时间,则必须使用currentTimeMillis
,因为nanoTime
不是线程安全的。
修改:
请参阅here
当收到标题时终止请求,当完全解析后,正文消息稍后与实体关联:
EntityUtils.consume(baseResponse.getEntity());