以毫秒计算时间差
我通过传递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()使用高分辨率计时器。