"Fast" 衡量代码执行时间的方法

"Fast" way to measure code execution time

我的代码中有一些子例程,我需要测量它们的执行时间。让我们假设例程在极端情况下每秒被调用 10-100 次。在 Fortran 中有许多方法可以测量时间,但由于调用频率的原因,我需要一种开销最低的方法。

时间测量本身不需要非常准确,因为我对子程序花费几毫秒或更短时间的情况不感兴趣,而是当它们达到 50 毫秒或更多时(这是我需要采取反制措施并在内部重新平衡一些事情。

代码是使用 MPI+OpenMP 并行化的,所以 MPI_Wtime() 是最简单的方法,但我想这个方法的相关成本相当高?我猜一个好的解决方案是 system_clock()。有谁知道每秒调用 50-100 次是否 "safe"(性能方面)?

system_clock 可能比 cpu_time 便宜得多,并且精度更高。

对于 Linux 上的 GFortran,我依稀记得我曾经通过在循环中调用它进行测试,并且 system_clock 每次调用大约需要 50 ns。

对于 Linux 上的 GFortran,system_clockclock_gettime(CLOCK_MONOTONIC, ...) 的包装器(在 Linux 上使用 vDSO 而不是真正的系统调用,因此它非常非常快) libgomp(GFortran 使用的 OpenMP 运行时库)中的 omp_get_wtime 也是如此,因此这两者的性能应该大致相同。

我不确定 MPI_Wtime 是如何在常见的 MPI 实现上实现的,但如果相同的话我不会感到惊讶。