以毫秒计算时间差

时间:2012-03-14 18:30:29

标签: java

我通过传递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才能获得响应。任何建议将不胜感激。

9 个答案:

答案 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非常棒,具有高度可读性和直观性。

类也是线程安全的。 !

参考文献:Oracle TutorialJava Magazine

答案 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));