2013-10-03 75 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微秒,這是每秒10K倍,在許多平臺最小休眠時間爲1毫秒。

+1

在非實時操作系統中,使用此技術幾乎不可能實現每秒20000次重複。 –

+0

它會在while循環中對Thread.yield()有利嗎?或者,這可能會導致等待時間過長,因爲沒有及時安排(在您稱之爲「抖動」時增加)? – Cruncher

+0

@StefanoSanfilippo它儘可能地接近你。如果你還隔離了CPU,你將得到小於20微秒的抖動。 –

0

這取決於你在做什麼,例如,如果你正在做一些網絡,你試圖做一些連接,它將取決於連接超時和其他一些因素。如果您正在執行一些基本操作,您將能夠控制操作的上限,例如每秒最多20次操作,但由於pc.So中正在運行的其他任務,您將永遠無法控制下限。它真的取決於你在做什麼,你正在運行的硬件(特別是處理器)以及該計算機的bussy。

1

如果您正在實施一個需要固定時間間隔執行的控制系統,並且您想用Java實現它,請閱讀real-time Java

如果您只需要重複執行某些操作並且毫秒級粒度足夠,請查看TimerScheduledThreadPoolExecutor

如果您需要更精細的粒度(即每秒超過1000次),但您並不嚴格要求您的代碼以精確的時間間隔執行,那麼您可能會得到Peter Lawrey的忙碌解決方案。

1

聽起來像來自Guava的RateLimiter的完美工作。

編輯

有一個一目瞭然成RateLimiter的FPGA實現 - 好,對於如此高的速率並不是一個理想的人選,因爲遞增它採用同步塊和睡覺計數器。但是,如果可以更改粒度,應該沒問題,即將您的20.000分成100個包,每個包包含200個項目。