Search code examples
c++clockrates

Is Increment Speed Affected By Clock Rate


Consider the loop below. This is a simplified example of a problem I am trying to solve. I want to limit the number of times doSomething function is called in each second. Since the loop works very fast, I thought I could use a rate limiter. Let's assume that I have found an appropriate value by running it with different x numbers.

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

while (true) {

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

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

I wonder if the number of calls to doSomething function would be less if I was working on a lower clock rate. In that case, I would like to limit the number of calls to doSomething function to once for each second. The second loop I have written is below.

float epsilon = 0.0001;
while (true) {

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

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

Would that do the trick for different clock cycles or are there still problems? Also, I would like to know if there is a better way of doing this. I have never worked with clock rates before and trying to understand how concerns differ when working with limited resources.

Note: Using sleep is not an option.


Solution

  • If I understand the issue proberly, you could use a std::chrono::steady_clock that you just add a second to every time a second has passed.

    Example:

    #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
    }