我正在使用 System.Time.Instant 来确定 Web 地址响应简单请求的速度。我的总体目标是确定我的家用计算机与我在 200 英里外的远程计算机上设置的服务之间的延迟。这是代码的简化版本,否则运行良好:
...//instantiated all necessary variables here....
Instant starts = Instant.now();
...
//Get information from web address
url = new URL(webAddress);
inputstream = url.openStream();
br = new BufferedReader(new InputStreamReader(inputstream));
//Wait for website to respond
while ((line = br.readLine()) != null)
{
instanceOutput += line;
}
Instant ends = Instant.now();
...
//Output the duration
return ("time required to get result: " + Duration.between(starts, ends).toMillis());
这往往会产生 0 毫秒或 14-16 毫秒的结果,或者偶尔会产生大约 15 毫秒的倍数的更长周期。但是,延迟为 0 毫秒在物理上是不可能的,即使向下舍入也是如此。两台机器相距 200 英里,因此信号必须至少花费 2 到 3 毫秒的时间,否则会超过光速。
我能找到的唯一类似问题是 2009 年的这个问题,第二个答案提出了一个原因(但使用了不同的方法),并且文档链接已损坏:Timer accuracy in java,另外,从那时起,Java 似乎已经更新了计时。而且,声称系统计时器没有定期更新似乎非同寻常,我在其他任何地方都找不到它重复。
这是将持续时间计算到最接近毫秒的足够好方法吗?从我最近读到的内容来看,纳秒计时器会更准确,但我不需要那么精确,而且我在不试图理解问题发生的原因并从中学习的情况下解决问题是一种糟糕的形式. 我在做什么错或误解?