C:Windows和其他操作系统中clock()的不同实现?

我必须为大学写一个非常简单的控制台程序,它必须测量input所需的时间。

为此,我在前面使用了clock() ,并在fgets()调用。 当在我的Windows电脑上运行它完美的工作。 然而,当我在朋友Mac-Book和Linux-PC上运行时,结果非常微弱(只有几微秒的时间)。

我在所有3个操作系统上尝试了以下代码:

 #include <stdio.h> #include <time.h> #include <unistd.h> void main() { clock_t t; printf("Sleeping for a bit\n"); t = clock(); // Alternatively some fgets(...) usleep(999999); t = clock() - t; printf("Processor time spent: %lf", ((double)t) / CLOCKS_PER_SEC); } 

在Windows上,输出显示1秒(或使用fgets时键入的时间),另外两个操作系统不超过0秒。

现在我的问题是为什么在这些操作系统上实现clock()有这样的区别。 对于Windows而言,当线程正在hibernate/等待时,时钟似乎不停地响起,但对于Linux和Mac而言,却不是?

编辑:谢谢你到目前为止的答案,所以这只是微软的错误实施真的。

任何人都可以请回答我最后的问题:

还有一种方法来衡量我想要做的测量所有3系统使用C标准库自clock()似乎只能在Windows上这样工作?

如果我们在Mac OS X上查看clock() 的源代码 ,我们看到它使用getrusage实现,并读取ru_utime + ru_stime 。 这两个字段用于度量进程(或由系统代表进程)使用的CPU时间 。 这意味着如果usleep (或者fgets )导致操作系统交换一个不同的程序执行,直到发生什么事情,那么任何实时的时间(也就是“挂钟”,也就是“挂钟”)不计算在内clock()在Mac OS X上返回的值。您可能会在Linux中找到类似的东西。

然而,在Windows上, clock() 返回从进程开始以来流逝的延迟时间量 。

在纯粹的C中,我没有意识到OS X,Linux和Windows上的函数可以返回秒钟精度的时间(time.h相当有限)。 你在Windows上有GetSystemTimeAsFileTime ,它将以100ns的分片数返回你的时间,BSD的gettimeofday将返回一个微秒精度的时间。

如果第二精度是可以接受的,你可以使用time(NULL)

如果C ++是一个选项,你可以使用std::chrono一个时钟来获得所需的精度。

您遇到Microsoft C运行时中的已知错误 。 即使行为不符合任何ISO C标准,也不会被修复。 从错误报告:

然而,我们选择避免​​重新实现clock(),使得它可能返回时间值比每秒物理速度提前一秒钟,因为这种改变会根据以前的行为悄悄地破坏程序(我们预计有很多这样的程式)。

在Linux上,你应该阅读时间(7) 。 它建议使用最近的MacOSX(和Linux上)应该存在的POSIX 2001 clock_gettime 。 在Linux上,运行在不太老的硬件(例如,不到6年的笔记本电脑或台式机)上, clock_gettime提供了很好的精度,通常几十微秒或更好。 它给出了秒和纳秒(在一个struct timespec )措施,但我不希望纳秒数字是非常准确的。

事实上, 时钟(3)被告知符合…

C89,C99,POSIX.1-2001。 POSIX要求CLOCKS_PER_SEC等于1000000独立于实际分辨率。

最后,几个框架库提供了功能(包装目标特定的系统功能)来测量时间。 看看POCO (用C ++)或Glib (用C和GTK&Gnome)。