6

在以下程序中,我尝试测量作业的执行时间(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);
}
4

1 回答 1

12

在这两种情况下,您都忽略tv_secstruct timespec,只使用不正确的纳秒ST,因为EVtv_nsec 可能是不同的秒。

来自男人

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;
}

有关实际功能和示例,请参阅此内容。diff

于 2013-07-17T17:01:24.927 回答