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

时间:2010-02-07 03:12:32

标签: c timer execution-time

目前我通过调用获取程序的执行挂起时间:

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

是否可以在毫秒中获得待机时间?如果是这样的话?

6 个答案:

答案 0 :(得分:9)

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

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

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

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

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

我在times()clock()上的亚秒计时器代码中也有注释,它们再次使用其他结构和标题。我还注意到Windows使用clock()每秒1000个时钟周期(毫秒时间),以及较旧的接口GetTickCount(),在Windows 95上需要注明,但在NT上没有。

答案 1 :(得分:3)

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

答案 2 :(得分:3)

我最近撰写了一篇解释how to obtain the time in milliseconds cross-platform的博客文章。

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

这是代码

#ifdef WIN32
#include <Windows.h>
#else
#include <sys/time.h>
#include <ctime>
#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
}

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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中获取更多信息。

答案 5 :(得分:-4)

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