6

このスレッドを読んだ後、clock_gettime() と clock_getres() が、Linux 環境で QueryPerformanceCounter と QueryPerformanceFrequency を実装するためのオプションであることを理解しました。

多くの例では、clock_gettime によって返された値を読み取り、それを使用することを提案しています。しかし、それは単なるナノ秒数であり、ティック数ではありません! したがって、Linux でティック数を取得する唯一の方法は、clock_gettime() と clock_getres() を組み合わせて使用​​することです。間違っている場合は修正してください。

だから私は自分の QueryPerformanceCounter を実装しました (そして、それは非常に醜いようです!) Linux に QueryPerformanceCounter を実装するより良い方法があるかどうかを知りたいと思いました。私のコードは以下です -

__int64 QueryPerformanceCounter()
{
    __int64 nsec_count, nsec_per_tick;
    /*
     * clock_gettime() returns the number of secs. We translate that to number of nanosecs.
     * clock_getres() returns number of seconds per tick. We translate that to number of nanosecs per tick.
     * Number of nanosecs divided by number of nanosecs per tick - will give the number of ticks.
     */
     struct timespec ts1, ts2;

     if (clock_gettime(CLOCK_MONOTONIC, &ts1) != 0) {
         printf("clock_gettime() failed");
         return -1;
     }

     nsec_count = ts1.tv_nsec + ts1.tv_sec * nsec_per_sec;

     if (clock_getres(CLOCK_MONOTONIC, &ts2) != 0) {
         LOG_ERROR("clock_getres() failed");
         return -1;
     }

     nsec_per_tick = ts2.tv_nsec + ts2.tv_sec * nsec_per_sec;

     return (nsec_count / nsec_per_tick);
}

ありがとう!

4

0 に答える 0