使用GNU时钟处理处理器时序溢出()

时间:2011-08-11 19:42:32

标签: c linux time clock

我需要在32位Linux系统上逐步计算一些C代码。我正在使用GNU clock()函数。这是我的代码的骨架以及相关的时钟位:

clock_t start, end;
double elapsed;

/* Init things */

start = clock();
while(terminationNotMet) { 

    /* Do some work. */

    end = clock();
    elapsed = ((double) (end - start)) / CLOCKS_PER_SEC;
    fprintf(fp,"%lf %d", elapsed, someResults);
}

现在的问题是clock_t实际上只是long int而且这段代码运行了很长时间。 clock()返回的经过的时钟滴答数最终会溢出,结果数据无用。有关某些变通方法或其他计时CPU时间的方法的想法吗? (使用挂钟时间不是一个选项,因为这些作业在多用户系统上运行)

2 个答案:

答案 0 :(得分:2)

不幸的是,这是glibc中的一个错误:clock_tsigned long而不是unsigned long,所以由于溢出而无法使用。它应该在减去它们之前将值转换为unsigned long,但这是一个丑陋的黑客。

更好的解决方案是使用带有clock_gettime时钟的现代CLOCK_CPUTIME函数。这将为您提供纳秒分辨率的结果,而不是clock给出的差分。

答案 1 :(得分:0)

如何更新每次迭代的开始时间:

elapsed = 0.0;
start = clock();
while(terminationNotMet) { 

    /* Do some work. */

    end = clock();
    elapsed += ((double) (end - start)) / CLOCKS_PER_SEC;
    fprintf(fp,"%lf %d", elapsed, someResults);
    start = end;
}