如何在C中以毫秒为单位获取程序的执行时间?

目前我通过调用以下命令获得程序的执行挂起时间:

time_t startTime = time(NULL); //section of code time_t endTime = time(NULL); double duration = difftime(endTime, startTime); 

是否有可能以毫秒为单位获得墙上时间? 如果是这样的话?

如果你在POSIX-ish机器上,请改用gettimeofday() ; 这为您提供了合理的便携性和微秒级分辨率。

稍微更深奥,但也在POSIX中,是clock_gettime()函数,它为您提供纳秒分辨率。

在许多系统上,你会发现一个函数ftime()实际上以秒和毫秒为单位返回时间。 但是,它不再是单Unix规范(与POSIX大致相同)。 您需要标头

 struct timeb mt; if (ftime(&mt) == 0) { mt.time ... seconds mt.millitime ... milliseconds } 

这至少可以追溯到版本7(或第7版)Unix,所以它已经广泛使用。

我还在times()clock() sub-second定时器代码中有注释,它们再次使用其他结构和头。 我还有关于Windows的使用clock() ,每秒1000个时钟周期(毫秒时间),以及较旧的接口GetTickCount() ,它在Windows 95上是必要的,但在NT上没有。

如果你可以在程序本身之外执行此操作,在linux中,你可以使用time命令( time ./my_program )。

我最近写了一篇博客文章,解释了如何跨平台获得毫秒级的时间 。

它会像time(NULL)一样工作,但会在windows和linux上返回unix时代的毫秒数而不是秒数。

这是代码

 #ifdef WIN32 #include  #else #include  #include  #endif /* Returns the amount of milliseconds elapsed since the UNIX epoch. Works on both * windows and linux. */ int64 GetTimeMs64() { #ifdef WIN32 /* Windows */ FILETIME ft; LARGE_INTEGER li; uint64 ret; /* Get the amount of 100 nano seconds intervals elapsed since January 1, 1601 (UTC) and copy it * to a LARGE_INTEGER structure. */ GetSystemTimeAsFileTime(&ft); li.LowPart = ft.dwLowDateTime; li.HighPart = ft.dwHighDateTime; ret = li.QuadPart; ret -= 116444736000000000LL; /* Convert from file time to UNIX epoch time. */ ret /= 10000; /* From 100 nano seconds (10^-7) to 1 millisecond (10^-3) intervals */ return ret; #else /* Linux */ struct timeval tv; uint64 ret; gettimeofday(&tv, NULL); ret = tv.tv_usec; /* Convert from micro seconds (10^-6) to milliseconds (10^-3) */ ret /= 1000; /* Adds the seconds (10^0) after converting them to milliseconds (10^-3) */ ret += (tv.tv_sec * 1000); return ret; #endif } 

如果需要,您可以将其修改为返回微秒而不是毫秒。

开源GLib库有一个GTimer系统,声称提供微秒精度。 该库可在Mac OS X,Windows和Linux上使用。 我目前正在使用它在Linux上执行性能计时,它似乎完美无缺。

gprof是GNU工具包的一部分,是一个选项。 大多数POSIX系统都会安装它,并且可以在Cygwin for Windows下使用。 使用gettimeofday()自己跟踪时间工作正常,但它的性能相当于使用print语句进行调试。 如果你只是想要一个快速而肮脏的解决方案,这很好,但它不如使用适当的工具那么优雅。

要使用gprof ,必须在使用gcc进行编译时指定-pg选项,如下所示:

 gcc -o prg source.c -pg 

然后你可以在生成的程序上运行gprof ,如下所示:

 gprof prg > gprof.out 

默认情况下,gprof将生成程序的总体运行时间,以及每个函数花费的时间量,每个函数的调用次数,每次函数调用所花费的平均时间以及类似信息。

您可以使用gprof设置大量选项。 如果您有兴趣,可以在手册页或Google中获取更多信息。

在Windows上,使用QueryPerformanceCounter和关联的QueryPerformanceFrequency。 他们没有给你一个可以翻译到日历时间的时间,所以如果你需要那个,那么使用CRT API请求时间,然后立即使用QueryPerformanceCounter。 然后,您可以执行一些简单的加法/减法来计算日历时间,由于连续执行API所需的时间会产生一些错误。 嘿,这是一台PC,你期待什么?