我需要在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时间的方法的想法吗? (使用挂钟时间不是一个选项,因为这些作业在多用户系统上运行)
答案 0 :(得分:2)
不幸的是,这是glibc中的一个错误:clock_t
是signed 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;
}