测量多线程程序的时间

时间:2011-10-27 15:42:30

标签: c time osx-snow-leopard parallel-processing

我用功能时钟()测量时间,但结果不好。我的意思是它为具有一个线程的程序和使用具有许多线程的OpenMP运行的相同程序提供相同的结果。但事实上,我注意到我的手表有许多线程程序计数更快。 所以我需要一些挂钟计时器......

我的问题是:这个问题有什么更好的功能? clock_gettime()或mb gettimeofday()?还是别的什么?

如果是clock_gettime(),那么用哪个时钟? CLOCK_REALTIME还是CLOCK_MONOTONIC?

使用mac os x(雪豹)

2 个答案:

答案 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);