gpt4 book ai didi

java - 如何在1秒内执行n次循环

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:40:24 27 4
gpt4 key购买 nike

我试图在一秒钟内执行 N 次指令或函数。我怎么能在java中做到这一点? 如下……

//in one second
while(N)
{
printf(".........");
int x=0;
printf("The value of x is ");
}

但问题实际上变得更深了..我正在尝试手动绘制像素并且我想要每秒旋转数的效果......所以基本上,它必须执行 N 次一秒钟(但这是无限完成​​的)

提前致谢

最佳答案

我会翻转这个问题:不要将循环限制在一秒钟内 N 次。相反,在所需时间内平均分配 N 个工作单元。

也就是说,计算自开始(或以前的工作)以来经过了多少时间,将其插入工作率,并且做那么多的工作(考虑开始/之前的时间和已经完成的工作量)。这是许多游戏/动画引擎的基础 - "delta time" .

然后在每个循环结束时调用 yield 以“很好”——或者更确切地说,防止占用 99% 以上的 CPU 使用率! yield 本身有一个最小分辨率1,但效果通常是足够的,尤其是在适当插值时。

因为使用了插值方法,这应该适用于所有 N(可以在分配的时间内运行),即使这意味着每个循环要执行更多的 N。也有可能对于小 N 的任何特定循环都没有完成任何工作,但是 yield 使这种“额外繁忙的循环”在 CPU 利用率方面变得便宜2 .


这是一些伪代码,可以在一秒钟内打印出 20 个“x”,其中 now 返回小数秒:

rate = 20       // per second - "N times per second"
done = 0
goal = 1 * rate // same as rate for 1 second
start = now()
while done < goal:
target = floor((now() - start) * rate)
work = (target - done) // work might be 0, that's okay
for 0 upto work:
print("x")
done += work
yield()

在这种情况下,由于恒定速率公式,很容易从开始时间进行插值。使用基于自上次工作(或循环)以来的时间的“增量时间”是相似的,适用于没有离散公式的情况,但稍微复杂一些,可能会导致细微的漂移错误。


1 actual sleep/yield 的时间分辨率取决于实现并因系统而异。例如,它的范围可能低至 1ms on Linux to 10-15ms on windows。 .

2 根据 Dariusz Wawer 的回答,除了处理时间增量外,还可以更改 sleep 周期。但是,这会增加复杂性,通常一个简单的 yield 就足够了。

关于java - 如何在1秒内执行n次循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14746072/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com