2013-10-03 3 views
7

Предположим, вам нужно было выполнить задачу с требованием сделать фиксированное количество раз (скажем 20,000) в секунду.Как сделать что-то n раз в секунду?

Как вы проводите свое время?

+3

Задайте задачу для выполнения функции ScheduledExecutorService. –

+2

Нам понадобится немного больше информации. Что происходит, когда задача 'n' переполняется? Выполнить одновременно две задачи или подождать? –

+1

Сделайте это 19,999 раза в секунду и немного ускоритесь. –

ответ

10

Для 20K раз в секунду вам нужно заняться, ожидая следующего интервала. Я предлагаю подождать до следующего раза, когда он должен был запустить, чтобы сгладить влияние дрожания.

long start = System.nanoTime(); 
long rate = 20000; 
for(long i = 0; ; i++) { 

    // do something 

    long end = start + i * 1000000000L/rate; 
    while(System.nanoTime() < end); 
} 

Причина вы не можете использовать встроенный планировщик, что минимальный квант времени 100 микро секунд, что 10К раз в секунду и минимальное время ожидания на многих платформах 1 милли-вторых.

+1

В режиме реального времени практически невозможно достичь точности 20000 повторений в секунду с помощью этой техники. –

+0

было бы полезно в цикле while Thread.yield()? Или это может вызвать слишком долгое ожидание из-за того, что не запланировано вовремя (увеличение «джиттера», как вы его называете)? – Cruncher

+0

@StefanoSanfilippo Это как можно ближе. Если вы также изолируете процессор, вы получите менее 20 микросекундных дрожаний. –

0

Это зависит от того, что вы делаете в этой задаче, например, если вы работаете в сети, где вы пытаетесь сделать какое-то соединение, это будет зависеть от времени ожидания соединения и некоторых других факторов. Если вы выполняете некоторые основные операции, вы сможете контролировать верхний предел операций, например максимум 20 операций в секунду, но вы никогда не сможете контролировать нижний предел из-за другой задачи, выполняемой в pc.So это действительно зависит от того, что вы делаете, от оборудования whitch, которое вы используете (специально для процессора), и как bussy - это компьютер.

1

Если вы реализуете систему управления, которая требует выполнения с фиксированным интервалом, и вы хотите реализовать ее на Java, прочитайте на real-time Java.

Если вам просто нужно что-то, выполняемое повторно, а миллисекунда - достаточная степень детализации, посмотрите на Timer или ScheduledThreadPoolExecutor.

Если вам нужна более тонкая детализация (т. Е. Более 1000 раз в секунду), но вы не требуете строгого выполнения кода с точными интервалами, вы можете пройти с ожидаемым решением Питера Лоури.

1

Звучит как отличная работа для RateLimiter от Guava.

РЕДАКТИРОВАТЬ

Если бы взгляд в РЕАЛИЗАЦИЯ RateLimiter «ы - ну, не является идеальным кандидатом для такой высокой скоростью, так как приращение счетчика он использует блоки с синхронизацией-и спит. Но это должно быть хорошо, если можно изменить детализацию, т. Е. Разделить 20.000 на 100 пакетов по 200 элементам каждый.

Смежные вопросы