System.currentTimeMillis по сравнению с System.nanoTime

Это происходит, когда вы пытаетесь получить доступ к ресурсам другого домена.

Это функция безопасности, позволяющая избежать свободного доступа к любым ресурсам этого домена (к которым можно получить доступ, например, для получения точной копии ваш сайт в пиратском домене.)

Заголовок ответа, даже если он 200OK не позволяет другим источникам (доменам, портам) обращаться к ресурсам ressources.

Вы можете исправить эта проблема, если вы являетесь владельцем обоих доменов:

Решение 1: через .htaccess

Чтобы изменить это, вы можете записать это в .htaccess запрошенного файла домена:

    <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
    </IfModule>

Решение 2: установите заголовки правильным способом

Если вы установите это в заголовок ответа запрошенного файла, вы разрешите всем получить доступ к ресурсам ressources:

Access-Control-Allow-Origin : *

ИЛИ

Access-Control-Allow-Origin : http://www.my-domain.com

Мир и код;)

367
задан mmcdole 9 December 2008 в 02:31
поделиться

4 ответа

Если Вы просто ищете чрезвычайно точные измерения [1 114] прошедшее время , используйте System.nanoTime(). System.currentTimeMillis() даст Вам самое точное прошедшее время в миллисекундах, так как эпоха, но System.nanoTime() дает Вам точное наносекундой время, относительно некоторой произвольной точки.

Из Документации Java:

public static long nanoTime()

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

Этот метод может только использоваться для измерения прошедшего времени и не связан ни с каким другим понятием системы или тактовое стеной время. Возвращенное значение представляет наносекунды с некоторого фиксированного, но произвольного момента времени (возможно, в будущем, таким образом, значения могут быть отрицательными). Этот метод обеспечивает точность наносекунды, но не обязательно точность наносекунды. Никакие гарантии не сделаны о том, как часто значения изменяются. Различия в последовательных вызовах, которые охватывают больше, чем приблизительно 292 года (2 <глоток> 63 наносекунды) точно не вычислят прошедшее время из-за числового переполнения.

, Например, для измерения, сколько времени некоторый код берет для выполнения:

long startTime = System.nanoTime();    
// ... the code being measured ...    
long estimatedTime = System.nanoTime() - startTime;

См. также: JavaDoc System.nanoTime () и JavaDoc System.currentTimeMillis () для большего количества информации

310
ответ дан 1565986223 4 November 2019 в 09:47
поделиться

Обновление Arkadiy: я наблюдал более корректное поведение System.currentTimeMillis() в Windows 7 в Oracle Java 8. Время было возвращено с 1 точностью миллисекунды. Исходный код в OpenJDK не изменился, таким образом, я не знаю то, что вызывает лучшее поведение.

<час>

David Holmes из Sun отправил статью блога пара несколько лет назад, которая имеет очень подробный взгляд на API синхронизации Java (в особенности System.currentTimeMillis() и System.nanoTime()), когда Вы хотели бы использовать, который, и как они работают внутренне.

Внутренняя часть Горячая точка VM: Часы, Таймеры и События Планирования - Первая часть - Windows

One, который очень интересный аспект таймера, используемого Java в Windows для API, которые имеют синхронизированный параметр ожидания, - то, что разрешение таймера может измениться в зависимости от того, чем другие вызовы API, возможно, были сделаны - в масштабе всей системы (не только в конкретном процессе). Он показывает пример, где использование Thread.sleep() вызовет это изменение разрешения.

58
ответ дан Community 4 November 2019 в 09:47
поделиться

Да, если такая точность требуется, используют System.nanoTime(), но знают, что Вы тогда требуете Java 5 + JVM.

В моих системах XP, я вижу системное время, которое, как сообщают, по крайней мере <ударило> 100 микросекунд 278 наносекунды использование следующего кода:

private void test() {
    System.out.println("currentTimeMillis: "+System.currentTimeMillis());
    System.out.println("nanoTime         : "+System.nanoTime());
    System.out.println();

    testNano(false);                                                            // to sync with currentTimeMillis() timer tick
    for(int xa=0; xa<10; xa++) {
        testNano(true);
        }
    }

private void testNano(boolean shw) {
    long strMS=System.currentTimeMillis();
    long strNS=System.nanoTime();
    long curMS;
    while((curMS=System.currentTimeMillis()) == strMS) {
        if(shw) { System.out.println("Nano: "+(System.nanoTime()-strNS)); }
        }
    if(shw) { System.out.println("Nano: "+(System.nanoTime()-strNS)+", Milli: "+(curMS-strMS)); }
    }
5
ответ дан Lawrence Dol 4 November 2019 в 09:47
поделиться

System.nanoTime() не поддерживается в более старом JVMs. Если это - беспокойство, палка с currentTimeMillis

Относительно точности, Вы почти корректны. На НЕКОТОРЫХ машинах Windows, currentTimeMillis() имеет разрешение приблизительно 10 мс (не 50 мс). Я не уверен, почему, но некоторые машины Windows так же точны как машины Linux.

я использовал GAGETimer в прошлом с умеренным успехом.

11
ответ дан ROMANIA_engineer 4 November 2019 в 09:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: