我必须为大学编写一个非常简单的控制台程序,该程序必须测量进行输入所需的时间。
因此,我clock()在fgets()通话前后都使用了它。在我的Windows计算机上运行时,它运行完美。但是,当在我的朋友Mac- Book和Linux-PC上运行时,它给出的结果非常小(仅几微秒的时间)。
clock()
fgets()
我在所有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),在其他两个OS上显示不超过0秒。
fgets
现在我的问题是,为什么clock()在这些OS上的实现会有如此不同。对于Windows,似乎线程在睡眠/等待时时钟一直在滴答,但是对于Linux和Mac不是吗?
编辑:到目前为止,谢谢您的回答,所以这实际上只是Microsoft的错误实现。
任何人都可以回答我的最后一个问题:
还有一种方法可以测量我想要在使用C标准库的所有3个系统上进行测量的方法,因为clock()这似乎只能在Windows上以这种方式工作?
如果我们看一下源代码,为clock()Mac OS X上,我们可以看到它使用的实施getrusage,并读取ru_utime + ru_stime。这两个字段测量进程(或系统,代表进程)使用的CPU时间。这意味着,如果usleep(或fgets)导致OS交换不同的程序以执行,直到发生某种情况,那么经过的任何实时时间(也称为“挂历时间”,如“挂钟”中所述)都不会计入该值可以clock()在Mac OS X上返回。您可能可以在Linux中进行挖掘并找到类似的东西。
getrusage
ru_utime + ru_stime
usleep
但是,在Windows上,clock() 返回自该过程开始以来经过的墙时间。
在纯C语言中,我不知道OS X,Linux和Windows上可用的函数将以亚秒级的精度返回时间(time.h相当有限)。你必须GetSystemTimeAsFileTime在Windows上,将返回你时间为100ns片,gettimeofday从BSD,将返回时间微秒精度。
GetSystemTimeAsFileTime
gettimeofday
如果您可以接受第二精度,则可以使用time(NULL)。
time(NULL)
如果选择C ++,则可以使用其中的一个时钟std::chrono来获得所需的精度。
std::chrono