以毫秒计算时间差

我通过传递ipAddress来调用方法,它将返回ipAddress的位置,如Country,City等等。所以我试图看看它为每次调用花了多少时间。 所以我在调用method和end_time之前设置了start_time。 所以有时我会得到0的差异 。 并且resp包含有效的响应。

long start_time = System.currentTimeMillis(); resp = GeoLocationService.getLocationIp(ipAddress); long end_time = System.currentTimeMillis(); long difference = end_time-start_time; 

所以这意味着有时需要0毫秒来获得响应。 任何建议将不胜感激。

尝试这个

 long start_time = System.nanoTime(); resp = GeoLocationService.getLocationByIp(ipAddress); long end_time = System.nanoTime(); double difference = (end_time - start_time) / 1e6; 

我非常喜欢(相对)新的java.time库:它接近真棒,imho。

您可以通过以下方式计算两个瞬间之间的持续时间:

 import java.time.* Instant before = Instant.now(); // do stuff Instant after = Instant.now(); long delta = Duration.between(before, after).toMillis(); // .toWhatsoever() 

API非常棒,高度可读且直观。

类也是线程安全的 。 !


参考资料: Oracle Tutorial , Java Magazine

不,这并不意味着它需要0ms – 它表明它比用currentTimeMillis()测量的时间要少。 那可能是10毫秒或15毫秒。 要求计时不是一个好方法; 获得当前时间更合适。

要测量某些事情需要多长时间,请考虑使用System.nanoTime 。 这里重点不在于精度更高,而是分辨率更高……但在用于测量两次调用之间的时间时。 它不能用作“挂钟”。

请注意,即使System.nanoTime只使用“系统中最精确的计时器” – 值得测量的是细粒度。 你可以这样做:

 public class Test { public static void main(String[] args) throws Exception { long[] differences = new long[5]; long previous = System.nanoTime(); for (int i = 0; i < 5; i++) { long current; while ((current = System.nanoTime()) == previous) { // Do nothing... } differences[i] = current - previous; previous = current; } for (long difference : differences) { System.out.println(difference); } } } 

在我的机器上显示大约466纳秒的差异...所以我不可能期望测量比这更快的东西所花费的时间。 (其他时间可能大约是这段时间的倍数。)

从Java 1.5开始,您可以使用System.nanoTime()获得更精确的时间值,这显然会返回纳秒。

当您获得即时结果时,实例中可能会进行一些缓存。

我不知道您的PersonalizationGeoLocationServiceClientHelper是如何工作的。 可能它会执行某种缓存,因此对相同IP地址的请求可能会非常快速地返回。

在差异小于0毫秒的这种小情况下,您也可以在纳秒内获得差异。

 System.nanoTime() 

你可以使用System.nanoTime();

要以可读格式获得结果,请使用TimeUnit.MILLISECONDS or NANOSECONDS

在过去(你知道,在任何时间之前)PC的BIOS计时器将以一定的间隔“打勾”。 该间隔大约为12毫秒。 因此,执行两次连续调用以获得时间并让它们返回零差异非常容易。 这只意味着计时器没有在两次通话之间“打勾”。 尝试在循环中获取时间并将值显示到控制台。 如果您的PC和显示器足够快,您将看到时间跳跃,使其看起来好像是量化的! (爱因斯坦会很沮丧!)较新的PC也有高分辨率计时器。 我想nanoTime()使用高分辨率计时器。