Подтвердить что ты не робот

Вычисление разницы во времени в миллисекундах

Я делаю вызов метода, передавая 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 мс, чтобы вернуть ответ. Любые предложения будут оценены.

4b9b3361

Ответ 1

Попробуйте это

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

Ответ 2

Нет, это не значит, что он принимает 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

Мне очень нравится (относительно) новая библиотека 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, Журнал Java

Ответ 4

Начиная с Java 1.5, вы можете получить более точное значение времени с помощью System.nanoTime(), которое, очевидно, возвращает наносекунды вместо этого.

Вероятно, некоторое кеширование происходит в тех случаях, когда вы получаете немедленный результат.

Ответ 5

Я не знаю, как работает ваш PersonalizationGeoLocationServiceClientHelper. Вероятно, он выполняет какое-то кэширование, поэтому запросы на один и тот же IP-адрес могут быть очень быстрыми.

Ответ 6

В таких небольших случаях, когда разница меньше 0 миллисекунд, вы также можете получить разницу в наносекундах.

System.nanoTime()

Ответ 7

Вы можете использовать   System.nanoTime();

Чтобы получить результат в читаемом формате, используйте   TimeUnit.MILLISECONDS or NANOSECONDS

Ответ 8

В старые времена (вы знаете, в любое время до вчерашнего дня) таймер ПК-BIOS "галочкой" в определенный промежуток времени. Этот интервал будет составлять порядка 12 миллисекунд. Таким образом, довольно просто выполнить два последовательных вызова, чтобы получить время и вернуть им нулевую разницу. Это означает, что таймер не "тикает" между двумя вашими вызовами. Попробуйте получить время в цикле и отобразить значения на консоли. Если ваш компьютер и дисплей достаточно быстр, вы увидите, что время прыгает, заставляя его выглядеть так, как будто он квантуется! (Эйнштейн был бы расстроен!) Новые ПК также имеют таймер с высоким разрешением. Я бы предположил, что nanoTime() использует таймер с высоким разрешением.