#define _POSIX_C_SOURCE 200809L
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

static double seconds(clockid_t id) {
    struct timespec ts;
    if (clock_gettime(id, &ts) != 0) { perror("clock_gettime"); exit(1); }
    return (double)ts.tv_sec + (double)ts.tv_nsec / 1e9;
}
int main(void) {
    const double demand = 0.75; /* CPU seconds, not elapsed seconds. */
    const double wall0 = seconds(CLOCK_MONOTONIC);
    const double cpu0 = seconds(CLOCK_PROCESS_CPUTIME_ID);
    volatile uint64_t state = 1;
    unsigned long batches = 0;
    do {
        for (int i = 0; i < 100000; ++i)
            state = state * UINT64_C(6364136223846793005) + 1;
        ++batches;
    } while (seconds(CLOCK_PROCESS_CPUTIME_ID) - cpu0 < demand);
    const double cpu = seconds(CLOCK_PROCESS_CPUTIME_ID) - cpu0;
    const double elapsed = seconds(CLOCK_MONOTONIC) - wall0;
    printf("cpu_s=%.6f elapsed_s=%.6f batches=%lu checksum=%llu\n",
           cpu, elapsed, batches, (unsigned long long)state);
    return 0;
}
