2013-09-11 3 views
17

Я изучаю компьютерную технику, где мы узнаем, что использование аппаратного таймера дает более точные результаты, чем задержка программного обеспечения. Я написал задержку программного обеспечения в сборке в течение 1 миллисекунды, и я могу начать процесс, который повторяет каждый миллисекун с использованием этой задержки, а счетчик делает что-то еще каждые 100 миллисекунды, и этот метод будет менее точным, чем использование аппаратного таймера, который я получил встроенное оборудование, которое я сейчас использую.Насколько точна Thread.sleep?

Так интересно, насколько точны сроки, которые встроены в Java? У нас есть System.currentTimeMillis и Thread.sleep, и они могут не использовать аппаратные таймеры, так насколько точны эти встроенные методы Java по сравнению с аппаратным таймером?

+3

Я считаю, что 'sleep' функции времени работать как«Сон по крайней мере для», тем более, что это будет должны взаимодействовать с планированием процессора и т. д. –

+0

Я бы предположил, что ваша машина является DOS'd, тогда она не будет очень точной. –

+2

Невероятно неточно. Вы должны иметь дело с несогласованностью планировщика процессов ОС, временем переключения контекста, виртуальной машиной Java и т. Д. –

ответ

10

Thread.sleep() неточно. Как неточно зависит от базовой операционной системы и ее таймеров и планировщиков. Я испытал, что сбор мусора, идущий параллельно, может привести к чрезмерному сну.

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

Если вам нужна более высокая производительность, взгляните на Java Real-Time System specification. Я не использовал его сам, поэтому я не могу предоставить более подробную информацию.

2

Из спецификации языка Java.

Thread.sleep вызывает в настоящее время выполняющийся поток спать (временно прекращают выполнение) в течение указанного срока, при условии точности и точности системных таймеров и планировщиков. Нить не теряет права собственности на какие-либо мониторы, а возобновление исполнения будет зависеть от планирования и доступности процессоров, на которых для выполнения потока.

2

Я не нашел Thread.sleep, чтобы быть точным. Фактически, я обнаружил, что он, кажется, спит меньше, чем то, что он обещает.

Результаты при настройке спать 1 миллисекунду:

********* Average elapsed time = 957 micro seconds 

Ниже мой тест:

public static void main(String[] args) throws InterruptedException { 
    List<Long> list = new ArrayList<Long>(); 

    int i= 0; 
    while(i <=100){ 

     long authStartTime = System.nanoTime(); 
     Thread.sleep(1); 
     long elapsedTime = System.nanoTime() - authStartTime; 
     System.out.println("*****"+elapsedTime/1000+ " mics"); 
     list.add(elapsedTime); 
     i++; 
    } 

    long sum=0; 
    for(long l : list){ 
     sum = sum + l; 
    } 
    System.out.println("********* Average elapsed time = "+sum/list.size()/1000+" micro seconds"); 
    System.exit(0); 
} 
Смежные вопросы