这是演示该行为的简化代码。
#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()
的行为很奇怪。
1条答案
按热度按时间slsn1g291#
在POSIX系统上(如Linux或macOS),
clock
函数报告进程使用的CPU时间,如果它没有使用任何CPU时间,比如等待了很长时间,那么你会得到非常小的差异。如果您将
clock_gettime
与CLOCK_MONOTONIC
或CLOCK_REALTIME
一起使用,则它们基于系统的 * 挂钟 *。注意,
clock
的行为在Windows上是不同的,Windows是挂钟的表示。