在以下程序中,我尝试测量作业的执行时间(for循环)。大部分时间它工作正常,但有时,它返回负值!我的第一个猜测是变量可能会溢出。任何人都可以告诉我,不管我是对吗?我该如何解决这个问题呢?
由于
int main(int argc, char **argv)
{
long int ST;
long int ET;
struct timespec gettime_now;
clock_gettime(CLOCK_REALTIME, &gettime_now);
ST= gettime_now.tv_nsec;
for (i=0; i < 1000; i++)
a[i]=b[i];
clock_gettime(CLOCK_REALTIME, &gettime_now);
ET= gettime_now.tv_nsec;
printf("Time diff: %ld\n", ET-ST);
}
答案 0 :(得分:10)
在这两种情况下,您忽略了tv_sec
struct timespec
只使用了纳米秒,这是不正确的ST
和EV
的tv_nsec可能有所不同第二的。
来自man,
tv_sec
- 表示自纪元以来的秒数
tv_nsec
- 当前秒,纳秒精度(1/1000000000秒)
最好编写自己的函数来找到差异。示例代码(未测试),
timespec diff(timespec start, timespec end)
{
timespec temp;
if ((end.tv_nsec-start.tv_nsec)<0
{
temp.tv_sec = end.tv_sec-start.tv_sec-1;
temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec;
}
else
{
temp.tv_sec = end.tv_sec-start.tv_sec;
temp.tv_nsec = end.tv_nsec-start.tv_nsec;
}
return temp;
}
请参阅this了解实际的diff
功能和示例。