Java 如何每秒做n次?

Java 如何每秒做n次?,java,performance,Java,Performance,假设您必须执行一项任务,要求每秒执行固定次数(例如20000) 您将如何安排活动时间?每秒20 k次,您需要忙着等待下一个时间间隔。我建议等到下一次应该运行时再消除抖动的影响 long start = System.nanoTime(); long rate = 20000; for(long i = 0; ; i++) { // do something long end = start + i * 1000000000L / rate; while(System.nan

假设您必须执行一项任务,要求每秒执行固定次数(例如
20000


您将如何安排活动时间?

每秒20 k次,您需要忙着等待下一个时间间隔。我建议等到下一次应该运行时再消除抖动的影响

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

   // do something

   long end = start + i * 1000000000L / rate;
   while(System.nanoTime() < end);
}
long start=System.nanoTime();
长期利率=20000;
用于(长i=0;i++){
//做点什么
长端=开始+i*1000000000L/速率;
while(System.nanoTime()

您不能使用内置调度器的原因是,最小时间片为100微秒,即每秒10K次,而在许多平台上的最小睡眠时间为1毫秒。

这取决于您在该任务中所做的工作,例如,如果您正在进行一些联网,在您尝试进行连接的地方,这将取决于连接超时和其他一些因素。如果您正在执行一些基本操作,您将能够控制操作的上限,例如每秒最多20次操作,但由于pc中正在运行的其他任务,您将永远无法控制下限。因此,这实际上取决于您正在做什么,取决于您正在运行的硬件(特别是procesor)这台计算机有多忙。

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

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


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

听起来像是来自Guava的用户的完美工作

编辑


浏览了一下RateLimitor的实现——对于如此高的速率来说,这不是一个理想的选择,因为递增计数器使用同步块和休眠。但是,如果可以更改粒度,也就是说,将
20.000
拆分为
100
包,每个包包含
200
项,则应该可以。

将任务交给
ScheduledExecutorService
执行。我们需要更多信息。任务
n
超限时会发生什么情况?同时运行两个任务或等待?每秒执行19999次,并稍微加快速度。@SotiriosDelimanolis我建议您尝试一下,看看会发生什么。。)对于这种需求,我会看看QNX或其他实时操作系统。在非实时操作系统上,使用这种技术几乎不可能精确地实现每秒20000次的重复。在while循环到Thread.yield()时,这是否有益?或者这会不会因为没有及时安排而导致等待时间过长(你称之为“抖动”的增加)?@StefanoSanfilippo这是你能得到的最接近的结果。如果您还隔离CPU,您将得到不到20微秒的抖动。@Cruncher在许多操作系统上,最小时间片是0.1毫秒,如果您希望每0.05毫秒运行一个任务,您就不能允许另一个线程运行。@PeterLawrey从本质上说,如果您在返回时关闭上下文,您将落后至少两次迭代?