如何每秒做n次?

时间:2013-10-03 20:15:53

标签: java performance

假设您必须执行一项任务,要求每秒执行固定次数(比如20,000)。

你会如何计划活动?

4 个答案:

答案 0 :(得分: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 :(得分:1)

如果您正在实施一个需要固定间隔执行的控制系统,而您想用Java实现它,请阅读real-time Java

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

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

答案 2 :(得分:1)

对于来自番石榴的RateLimiter来说,这听起来很完美。

修改

瞥了一眼RateLimiter的实现 - 好吧,不是这么高的理想候选人,因为增加计数器它会使用同步块和睡眠。但是,如果可以更改粒度,则应该没问题,即将20.000分成100200个项目。

答案 3 :(得分:0)

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