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?
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?
对于每秒 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 毫秒。
如果您正在实现一个需要固定间隔执行的控制系统,并且您想在 Java 中实现它,请阅读实时 Java。
如果您只需要重复执行某些操作并且毫秒粒度就足够了,请查看Timer或ScheduledThreadPoolExecutor。
如果您需要更精细的粒度(即每秒超过 1000 次),但您并不严格要求您的代码以精确的时间间隔执行,您可以使用 Peter Lawrey 的忙等待解决方案。
听起来像是Guava的RateLimiter的完美工作。
编辑
看了一眼RateLimiter
's implementation - 好吧,不是一个如此高速率的理想候选者,因为要增加计数器,它使用同步块和睡眠。但是如果可以改变粒度应该没问题,即将你的每个项目分成20.000
几100
包200
。
这取决于您在该任务中在做什么,例如,如果您正在做一些网络,您正在尝试进行一些连接,这将取决于连接超时和其他一些因素。如果您正在执行一些基本操作,您将能够控制操作的上限,例如每秒最多 20 次操作,但由于在 pc 中运行的其他任务,您将永远无法控制下限。所以这真的取决于你在做什么,你正在运行的硬件(特别是处理器)以及那台计算机的繁忙程度。