【发布时间】:2019-07-07 18:04:37
【问题描述】:
我正在尝试在executionTime 指定的确切时间执行循环。我正在使用ctime 来获取这个时间,并且我需要它在几毫秒的精度内(我相信它是)。一旦该循环运行指定的执行时间,它应该会中断。
我的问题是执行时间为 0.5,打印的结果是 1。经过进一步测试,我的程序似乎将执行时间四舍五入到最接近的整数。所以对于 4.5executionTime,打印的执行时间是 5.0000000。我的代码如下。我不确定这个错误来自哪里。
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
float executionTime = 4.5;
int i;
float timeDifference = -1;
time_t t1;
time_t t2;
t1 = time(0);
for (i = 0; i < 1000000000; i++)
{
t2 = time(0);
timeDifference = difftime(t2, t1);
if (timeDifference >= executionTime)
{
break;
}
}
printf("time difference is: %f\n", timeDifference);
return 0;
}
新版本尝试使用clock_gettime。这个版本的问题是在循环内由于某种原因达到执行时间时永远不会中断。
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#define BILLION 1E9
int main()
{
float executionTime = 4.5;
int i;
float elapsedTime = -1;
struct timespec start;
struct timespec stop;
//Get starting time
clock_gettime(CLOCK_REALTIME, &start);
for (i = 0; i < 1000000000; i++)
{
//Get current time
clock_gettime(CLOCK_REALTIME, &stop);
elapsedTime = ((stop.tv_sec - start.tv_sec) + (stop.tv_nsec - start.tv_nsec)) / BILLION;
if (elapsedTime >= executionTime)
{
break;
}
}
printf("time difference is: %f\n", elapsedTime);
return 0;
}
【问题讨论】:
-
从this question 看来,C 不保证
time_t的类型,因此可能是整数类型被传递给difftime,导致时间差为整数秒. -
强烈建议(因为
time()的粒度为1秒)使用函数setitimer(),该函数用于设置间隔并在该间隔到期时设置信号 -
@user3629249 是的,我放弃了
time()的用法,现在正在使用第二部分更新版本(在 OG 帖子中进一步向下)。我现在使用clock_gettime()。