ncurses中的clock()行为

pdkcd3nj  于 2022-12-22  发布在  其他
关注(0)|答案(1)|浏览(117)

这是演示该行为的简化代码。

#include <stdio.h>
#include <ncurses.h>
#include <time.h>

#define DELAY  2.0

int main ( void) {
    static clock_t start;
    static double delay = 0.0;
    double elapsed = 0.0;
    clock_t stop;

    initscr ( );
    timeout ( 20); // milliseconds getch waits for a character

    if ( delay < .0001) {
        start = clock();
        delay = DELAY;
    }
    do {
        // getch ( );
        stop = clock();
        elapsed = (double)( stop - start) / CLOCKS_PER_SEC;
        move ( 22, 0);
        printw ( "cps %ld elapsed %f\n", CLOCKS_PER_SEC, elapsed);
        refresh ( );
    } while ( elapsed < delay);
    endwin ( );
    return 0;
}

ncurses编译和链接,它运行大约两秒钟。
取消// getch ( );的注解,重新编译和链接,它运行了大约200秒。
使用clock_gettime()解决了这个问题。
我很好奇为什么clock()的行为很奇怪。

slsn1g29

slsn1g291#

在POSIX系统上(如Linux或macOS),clock函数报告进程使用的CPU时间,如果它没有使用任何CPU时间,比如等待了很长时间,那么你会得到非常小的差异。
如果您将clock_gettimeCLOCK_MONOTONICCLOCK_REALTIME一起使用,则它们基于系统的 * 挂钟 *。
注意,clock的行为在Windows上是不同的,Windows是挂钟的表示。

相关问题