我正在尝试执行executionTime
指定的确切时间的循环。我正在使用ctime
来获得该时间,我需要它在几毫秒的精度范围内(我相信是)。一旦该循环运行了指定的执行时间,它就会中断。
我的问题是执行时间为0.5,正在打印的结果为1。经过进一步测试,看来我的程序将执行时间四舍五入为最接近的整数。因此,对于4.5 executionTime
,要打印的执行时间为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;
}
答案 0 :(得分:1)
time()
返回最接近的秒,而difftime()
返回两者的差。因此,基本上该函数计算到整数的差。为了获得更准确的估算,您可以使用clock()
time_t
的目的是测量日历时间
int main()
{
float executionTime = 1.3;
int i;
double timeDifference = 1.0;
clock_t t1;
clock_t t2;
t1 = clock();
for (i = 0; i < 1000000000; i++)
{
timeDifference = (double)(clock() - t1) / CLOCKS_PER_SEC;
if (timeDifference >= executionTime)
{
break;
}
}
printf("time difference is: %.9g\n", timeDifference);
return 0;
}
答案 1 :(得分:1)
clock_gettime
可用于获得更高的准确性。
调用delay
并设置一个大于0的值来设置延迟时间,然后使用-1来检查经过的时间。
在main中调用clock_gettime
会得到main中已用的时间。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#define BILLION 1E9
int delay ( double seconds)
{
static double usec = 0.0;
double elapsed = 0.0;
static struct timespec start;
struct timespec stop;
if ( 0.0 <= seconds) {
usec = seconds;
clock_gettime ( CLOCK_REALTIME, &start);
return 0;
}
clock_gettime ( CLOCK_REALTIME, &stop);
elapsed = difftime ( stop.tv_sec, start.tv_sec);
elapsed += ( stop.tv_nsec - start.tv_nsec) / BILLION;
if ( ( elapsed < usec)) {
return 1;
}
return 0;
}
int main() {
double executionTime = 4.5;
int i;
double timeDifference = -1;
struct timespec end;
struct timespec begin;
clock_gettime ( CLOCK_REALTIME, &begin);
delay( executionTime);//call to set time
for (i = 0; i < 1000000000; i++)
{
if ( !delay( -1)) {//call to check elapsed time
break;
}
}
clock_gettime ( CLOCK_REALTIME, &end);
timeDifference = difftime ( end.tv_sec, begin.tv_sec);
timeDifference += ( end.tv_nsec - begin.tv_nsec) / BILLION;
printf("time difference is: %f\n", timeDifference);
return 0;
}