7

Suppose you had to perform a task with a requirement of doing it fixed number of times (say 20,000) per second.

How would you time the event?

4

4 回答 4

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 毫秒。

于 2013-10-03T20:19:08.240 回答
1

如果您正在实现一个需要固定间隔执行的控制系统,并且您想在 Java 中实现它,请阅读实时 ​​Java

如果您只需要重复执行某些操作并且毫秒粒度就足够了,请查看TimerScheduledThreadPoolExecutor

如果您需要更精细的粒度(即每秒超过 1000 次),但您并不严格要求您的代码以精确的时间间隔执行,您可以使用 Peter Lawrey 的忙等待解决方案。

于 2013-10-03T22:15:55.497 回答
1

听起来像是Guava的RateLimiter的完美工作。

编辑

看了一眼RateLimiter's implementation - 好吧,不是一个如此高速率的理想候选者,因为要增加计数器,它使用同步块和睡眠。但是如果可以改变粒度应该没问题,即将你的每个项目分成20.000100200

于 2013-10-03T22:27:55.653 回答
0

这取决于您在该任务中在做什么,例如,如果您正在做一些网络,您正在尝试进行一些连接,这将取决于连接超时和其他一些因素。如果您正在执行一些基本操作,您将能够控制操作的上限,例如每秒最多 20 次操作,但由于在 pc 中运行的其他任务,您将永远无法控制下限。所以这真的取决于你在做什么,你正在运行的硬件(特别是处理器)以及那台计算机的繁忙程度。

于 2013-10-03T21:23:58.810 回答