增量速度受时钟速率影响吗

Is Increment Speed Affected By Clock Rate

考虑下面的循环。这是我试图解决的问题的简化示例。我想限制每秒调用 doSomething 函数的次数。由于循环工作得非常快,我想我可以使用速率限制器。让我们假设我已经通过 运行 它与不同的 x 数字找到了一个合适的值。

unsigned int incrementionRate = x;
unsigned int counter == 0;

while (true) {

    double seconds = getElapsedSeconds();
    print(seconds);

    counter = (counter + 1) % incrementionRate;
    if (counter == 0) {
        doSomething();
    }
}

我想知道如果我使用较低的时钟速率,调用doSomething 函数的次数是否会减少。在那种情况下,我想将对 doSomething 函数的调用次数限制为每秒一次。我写的第二个循环如下。

float epsilon = 0.0001;
while (true) {

    double seconds = getElapsedSeconds();
    print(seconds);

    if (abs(seconds - floor(seconds)) <= epsilon) {
        doSomething();
    }
}

这对不同的时钟周期是否有效,还是仍然存在问题?另外,我想知道是否有更好的方法来做到这一点。我以前从未使用过时钟速率,并试图了解在使用有限资源时的关注点有何不同。

注意:使用睡眠不是一个选项。

如果我深入了解这个问题,您可以使用 std::chrono::steady_clock,每过一秒就加一秒。

示例:

#include <chrono>

auto end_time = std::chrono::steady_clock::now();

while (true) {
    // only call doSomething once a second
    if(end_time < std::chrono::steady_clock::now()) {
        doSomething();
        // set a new end time a second after the previous one
        end_time += std::chrono::seconds(1);
    }

    // do something else
}

Ted's answer 如果您 真的 在循环中做其他事情,那很好;但是,如果 不是 ,这将导致繁忙的等待,这只会白白消耗您的 CPU。

在这种情况下,您宁愿让线程休眠:

    std::chrono::milliseconds offset(200);
    auto next = std::chrono::steady_clock::now();
    for(;;)
    {
        doSomething();
        next += offset;
        std::this_thread::sleep_until(next);
    }

您需要包含 chronothread headers。

最后我决定采用更简单的方法。使用可调的时间间隔,只存储最新的更新时间,没有引入任何新机制。老实说,现在我不知道为什么一开始我想不起来。想太多是个问题。 :)

double lastUpdateTimestamp = 0;
const double updateInterval = 1.0;

while (true) {

    double seconds = getElapsedSeconds();
    print(seconds);

    if ((elapsedSeconds - lastUpdateTimestamp) >= updateInterval) {
        doSomething();
        lastUpdateTimestamp = elapsedSeconds;
    }
}