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

Max*_*son 5 c linux windows macos clock

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

因此我clock()在前面和fgets()通话后使用.在我的Windows计算机上运行时,它工作得很好.然而,当我在我的朋友Mac-Book和Linux-PC上运行时,它给出了非常小的结果(只有几微秒的时间).

我在所有3 OS上尝试了以下代码:

#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);
}
Run Code Online (Sandbox Code Playgroud)

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

现在我的问题是为什么clock()在这些操作系统的实现上存在这样的差异.对于Windows来说,当线程处于休眠/等待状态时,时钟似乎仍在滴答作响,但对于Linux和Mac则不然?

编辑:感谢你们到目前为止的答案,所以这只是微软的错误实现.

有人可以回答我的上一个问题:

还有一种方法可以测量我想要使用C标准库在所有3个系统上测量的内容,因为它clock()似乎只在Windows上以这种方式工作吗?

cre*_*mno 5

您在 Microsoft 的 C 运行时中遇到了一个已知错误。即使该行为不符合任何 ISO C 标准,也不会得到修复。从错误报告来看:

然而,我们选择避免​​以这样的方式重新实现clock(),即它返回的时间值可能会以每物理秒超过一秒的速度前进,因为这种更改会根据之前的行为悄悄地破坏程序(并且我们预计有很多这样的情况)程式)。


zne*_*eak 2

如果我们查看 Mac OS X 上的源代码clock()我们会发现它是使用getrusage和 读取的ru_utime + ru_stime。这两个字段测量进程(或代表进程的系统)使用的CPU时间。这意味着,如果usleep(或fgets)导致操作系统交换不同的程序来执行,直到发生某些情况,则经过的任何实际时间(也称为“挂钟”,如“挂钟”)不计入该值在 Mac OS X 上返回clock()。您可能会在 Linux 中深入研究并找到类似的东西。

然而,在 Windows 上,返回自进程开始以来经过的clock() 挂起时间量。

在纯 C 中,我不知道 OS X、Linux 和 Windows 上是否有可用的函数可以以亚秒精度返回挂钟时间(time.h 相当有限)。在GetSystemTimeAsFileTimeWindows 上,将以 100 纳秒为单位返回时间,gettimeofday在 BSD 上,将返回微秒精度的时间。

如果您可以接受第二精度,则可以使用time(NULL).

如果可以选择 C++,您可以使用其中一个时钟来std::chrono获得所需精度的时间。