我通过传递ipAddress来调用方法,它将返回ipAddress的位置,如Country,City等等。所以我试图看看它为每次调用花了多少时间。所以我在调用方法之前设置了start_time,在调用之后设置了end_time。 所以有时我会得到0 的差异。并且resp包含有效的响应。
long start_time = System.currentTimeMillis();
resp = GeoLocationService.getLocationIp(ipAddress);
long end_time = System.currentTimeMillis();
long difference = end_time-start_time;
因此,这意味着有时需要0 ms才能获得响应。任何建议将不胜感激。
答案 0 :(得分:51)
试试这个
long start_time = System.nanoTime();
resp = GeoLocationService.getLocationByIp(ipAddress);
long end_time = System.nanoTime();
double difference = (end_time - start_time) / 1e6;
答案 1 :(得分:22)
我非常喜欢(相对)新的java.time库:它非常棒,非常棒。
您可以通过以下方式计算两个时刻之间的持续时间:
import java.time.*
Instant before = Instant.now();
// do stuff
Instant after = Instant.now();
long delta = Duration.between(before, after).toMillis(); // .toWhatsoever()
API非常棒,具有高度可读性和直观性。
类也是线程安全的。 !
答案 2 :(得分:13)
不,这并不意味着它花了0毫秒 - 它表明它花费的时间比用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纳秒的差异...所以我不可能期望测量比这更快的东西所花费的时间。 (其他时间可能大约是这段时间的倍数。)
答案 3 :(得分:4)
从Java 1.5开始,您可以使用System.nanoTime()
获得更精确的时间值,这显然会返回纳秒。
当您获得即时结果时,实例中可能会进行一些缓存。
答案 4 :(得分:1)
我不知道你的PersonalizationGeoLocationServiceClientHelper
是如何运作的。可能它执行某种缓存,因此对相同IP地址的请求可能会非常快地返回。
答案 5 :(得分:0)
在差异小于0毫秒的小情况下,你也可以在纳秒内获得差异。
System.nanoTime()
答案 6 :(得分:0)
你可以使用
System.nanoTime();
要以可读格式获得结果,请使用
TimeUnit.MILLISECONDS or NANOSECONDS
答案 7 :(得分:0)
在过去(你知道,在任何时间之前的任何时候),PC的BIOS计时器会打勾&#34;打勾&#34;在一定的间隔。该间隔大约为12毫秒。因此,执行两次连续调用以获得时间并使它们返回零差异非常容易。这只意味着计时器没有打勾&#34;你的两个电话之间。尝试在循环中获取时间并将值显示到控制台。如果您的PC和显示器足够快,您会看到时间跳跃,使其看起来像是量化的! (爱因斯坦会很沮丧!)较新的PC也有高分辨率计时器。我想象nanoTime()使用高分辨率计时器。
答案 8 :(得分:0)
从Java 8开始,您可以尝试以下操作:
import java.time.*;
import java.time.temporal.ChronoUnit;
Instant start_time = Instant.now();
// Your code
Instant stop_time = Instant.now();
System.out.println(Duration.between(start_time, stop_time).toMillis());
//or
System.out.println(ChronoUnit.MILLIS.between(start_time, stop_time));