目前我通过调用秒获取程序的执行挂起时间:
time_t startTime = time(NULL);
//section of code
time_t endTime = time(NULL);
double duration = difftime(endTime, startTime);
是否可以在毫秒中获得待机时间?如果是这样的话?
答案 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,你期待什么?