我用功能时钟()测量时间,但结果不好。我的意思是它为具有一个线程的程序和使用具有许多线程的OpenMP运行的相同程序提供相同的结果。但事实上,我注意到我的手表有许多线程程序计数更快。 所以我需要一些挂钟计时器......
我的问题是:这个问题有什么更好的功能? clock_gettime()或mb gettimeofday()?还是别的什么?
如果是clock_gettime(),那么用哪个时钟? CLOCK_REALTIME还是CLOCK_MONOTONIC?
使用mac os x(雪豹)
答案 0 :(得分:3)
如果你想要挂钟时间,并且clock_gettime()
可用,那么这是一个不错的选择。如果您正在测量时间间隔,请将其与CLOCK_MONOTONIC
一起使用,并CLOCK_REALTIME
来获取实际时间。
CLOCK_REALTIME
为您提供实际的时间,但会受到系统时间调整的影响 - 因此,如果在程序运行时调整系统时间,则会使用它来调整间隔时间。
CLOCK_MONOTONIC
没有给你一天中的正确时间,但它确实以相同的速率计数并且不受系统时间变化的影响 - 因此它非常适合测量间隔,但在正确时间时无用显示或时间戳需要一天。
答案 1 :(得分:1)
我认为clock()计算所有线程中的总CPU使用率,我也有这个问题......
挂钟计时方法的选择是个人喜好。我使用内联包装函数来获取时间戳(使用2个时间戳的差异来计算处理时间)。为方便起见,我使用了浮点数(单位是秒,不必担心整数溢出)。对于多线程,有很多异步事件,在我看来,时间低于1微秒是没有意义的。到目前为止,这对我来说非常有效:)
无论您选择什么,包装都是最简单的实验方式
inline double my_clock(void) {
struct timeval t;
gettimeofday(&t, NULL);
return (1.0e-6*t.tv_usec + t.tv_sec);
}
用法:
double start_time, end_time;
start_time = my_clock();
//some multi-threaded processing
end_time = my_clock();
printf("time is %lf\n", end_time-start_time);