C:使用clock()来测量multithreading程序中的时间
我一直使用clock()来衡量我的应用程序从开始到结束花费多less时间,
int main(int argc, char *argv[]) { const clock_t START = clock(); // ... const double T_ELAPSED = (double)(clock() - START) / CLOCKS_PER_SEC; }
由于我开始使用POSIX线程,这似乎失败了。 它看起来像clock()N线程增加N倍。 因为我不知道有多less线程正在同时运行,所以这种方法失败了。 那我怎么测量已经过了多less时间?
clock()
度量你的进程使用的CPU时间,而不是挂钟时间。 当你有多个线程同时运行时,显然可以更快地消耗CPU时间。
如果您想知道挂钟的执行时间,则需要使用适当的function。 ANSI C中唯一一个是time()
,通常只有1秒的分辨率。
但是,正如你所说的,你使用的是POSIX,这意味着你可以使用time.h
定义的clock_gettime()
。 特别是CLOCK_MONOTONIC
时钟最适合用于:
struct timespec start, finish; double elapsed; clock_gettime(CLOCK_MONOTONIC, &start); /* ... */ clock_gettime(CLOCK_MONOTONIC, &finish); elapsed = (finish.tv_sec - start.tv_sec); elapsed += (finish.tv_nsec - start.tv_nsec) / 1000000000.0;
(请注意,我已经仔细计算了elapsed
,以确保在计算非常短的时间间隔时精度不会丢失)。
如果您的操作系统没有提供CLOCK_MONOTONIC
(您可以在运行时使用sysconf(_SC_MONOTONIC_CLOCK)
)检查),那么可以使用CLOCK_REALTIME
作为回退 – 但请注意,后者的缺点是,如果系统时间为在您的进程正在运行时更改。
你需要什么时间分辨率? 你可以在time.h中使用time()作为第二个分辨率。 如果你需要更高的分辨率,那么你可以使用更多系统特定的东西。 请参阅计时器function使用C ++提供纳秒时间