我想知道一些代码块执行的时间(大约)。像这样:
startStopwatch();
// do some calculations
stopStopwatch();
printf("%lf", timeMesuredInSeconds);
如何?
答案 0 :(得分:59)
您可以使用time.h
中的clock
方法
示例:
clock_t start = clock();
/*Do something*/
clock_t end = clock();
float seconds = (float)(end - start) / CLOCKS_PER_SEC;
答案 1 :(得分:17)
您可以使用time.h库,特别是time和difftime函数:
/* difftime example */
#include <stdio.h>
#include <time.h>
int main ()
{
time_t start,end;
double dif;
time (&start);
// Do some calculation.
time (&end);
dif = difftime (end,start);
printf ("Your calculations took %.2lf seconds to run.\n", dif );
return 0;
}
(示例改编自上面链接的difftime网页。)
请注意,此方法只能提供几秒钟的精确度 - time_t
记录自UNIX epoch(1970年1月1日)以来的秒数。
答案 2 :(得分:2)
的GetTickCount()。
#include <windows.h>
void MeasureIt()
{
DWORD dwStartTime = GetTickCount();
DWORD dwElapsed;
DoSomethingThatYouWantToTime();
dwElapsed = GetTickCount() - dwStartTime;
printf("It took %d.%3d seconds to complete\n", dwElapsed/1000, dwElapsed - dwElapsed/1000);
}
答案 3 :(得分:1)
我会使用Windows API的QueryPerformanceCounter和QueryPerformanceFrequency函数。在块之前和之后调用前者并减去(当前 - 旧)以获得实例之间的“滴答”数。将其除以后一个函数获得的值,以秒为单位得到持续时间。
答案 4 :(得分:0)
如果您不需要出色的分辨率,可以使用GetTickCount():http://msdn.microsoft.com/en-us/library/ms724408(VS.85).aspx (如果它是用于你自己的简单诊断之外的其他东西,那么请注意这个数字可以包围,所以你需要通过一点算术处理它。)
QueryPerformanceCounter是另一个合理的选择。 (它也在MSDN上描述)
答案 5 :(得分:0)
有时需要测量天文时间而不是 CPU时间(尤其适用于 Linux ):
#include <time.h>
double what_time_is_it()
{
struct timespec now;
clock_gettime(CLOCK_REALTIME, &now);
return now.tv_sec + now.tv_nsec*1e-9;
}
int main() {
double time = what_time_is_it();
printf("time taken %.6lf\n", what_time_is_it() - time);
return 0;
}
答案 6 :(得分:0)
标准C库提供了time
函数,如果您只需要比较秒,它就很有用。但是,如果需要毫秒级的精度,则最可移植的方法是调用timespec_get
。如果系统支持的话,它可以告诉时间高达纳秒的精度。但是,调用它需要花费更多的精力,因为它涉及结构。这是一个仅将结构转换为简单的64位整数的函数。
#include <stdio.h>
#include <inttypes.h>
#include <time.h>
int64_t millis()
{
struct timespec now;
timespec_get(&now, TIME_UTC);
return ((int64_t) now.tv_sec) * 1000 + ((int64_t) now.tv_nsec) / 1000000;
}
int main(void)
{
printf("Unix timestamp with millisecond precision: %" PRId64 "\n", millis());
}
与clock
不同,此函数返回Unix时间戳,因此它将正确考虑阻塞函数(例如sleep
)所花费的时间。这对于基准测试和实施考虑到运行时间的延迟很有用。