簡體   English   中英

以毫秒為單位計算時間差

[英]Calculating time difference in Milliseconds

我正在通過傳遞 ipAddress 調用一個方法,它將返回 ipAddress 的位置,如國家、城市等。所以我想看看每次調用需要多少時間。 所以我在調用方法之前設置了 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 毫秒才能得到響應。 任何建議將不勝感激。

試試這個

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

我非常喜歡(相對)新的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 教程Java 雜志

不,這並不意味着它需要 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 納秒的差異......所以我不可能期望測量比這更快的時間。 (而其他時間很可能是該時間的大致倍數。)

從 Java 1.5 開始,您可以使用System.nanoTime()獲得更精確的時間值,顯然它返回的是納秒。

當您立即獲得結果時,可能會進行一些緩存。

從 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));

在過去(您知道,在昨天之前的任何時間),PC 的 BIOS 計時器會以特定時間間隔“滴答”。 該間隔大約為 12 毫秒。 因此,很容易執行兩次連續調用來獲取時間並讓它們返回零差值。 這僅意味着計時器在您的兩次通話之間沒有“滴答”。 嘗試在循環中獲取時間並將值顯示到控制台。 如果您的 PC 和顯示器足夠快,您會看到時間跳躍,使它看起來好像被量化了! (愛因斯坦會不高興!)較新的個人電腦也有一個高分辨率的計時器。 我想 nanoTime() 使用高分辨率計時器。

我不知道您的PersonalizationGeoLocationServiceClientHelper是如何工作的。 可能它會執行某種緩存,因此對相同 IP 地址的請求可能會以極快的速度返回。

在這種差異小於 0 毫秒的小情況下,您也可以獲得納秒級的差異。

System.nanoTime()

您可以使用System.nanoTime();

要以可讀格式獲取結果,請使用TimeUnit.MILLISECONDS or NANOSECONDS

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM