`time`基准测试实用程序:`user` +`sys` = 0实际上意味着什么?

时间:2014-07-25 12:13:42

标签: c++ fortran

我觉得Why is this C++ program so incredibly fast?讨论中遗漏的一个比较是Fortran。我翻译了Sven Hager's C ++基准:

#include <iostream>
#include <cstdlib>
#include <cstdint>

int main(int argc, char* argv[]) {
  uint32_t s = 0;
  uint32_t outer = atoi(argv[1]);
  uint32_t inner = atoi(argv[2]);
  for (uint32_t i = 0; i < outer; ++i) {
    for (uint32_t j = 0; j < inner; ++j)
      ++s;
    s -= inner;
  }
  std::cout << s << std::endl;
  return 0;
}

到它的Fortran等价物:

PROGRAM Benchmark
  IMPLICIT NONE
  INTEGER :: i,j,s
  INTEGER, PARAMETER :: outer=1000,inner=1000000
  s = 0
  DO i = 1, outer
    DO j = 1, inner
      s = s + 1
    END DO
    s = s - inner
  END DO
PRINT *, s
END PROGRAM Benchmark

并使用gfortran -g -std=f2008 -Wall -Wextra -O3 Benchmark.f08编译了完全优化的版本。我希望能够像Herr Hager那样获得类似的表现:

real    0m0.003s
user    0m0.002s
sys 0m0.002s

我得到的有点令人费解:

real    0m0.003s
user    0m0.000s
sys 0m0.000s

深入挖掘,我在What do 'real', 'user' and 'sys' mean in the output of time(1)?找到了这个讨论。在其中,他们说user + sys给出了进程使用的实际CPU时间。 那么,user + sys零实际意味着什么?

1 个答案:

答案 0 :(得分:1)

在这种情况下,“零”表示“小于一毫秒”(或半毫秒,取决于它是如何舍入的),因为这是time给出的时间分辨率。

它仅适用于测量运行时间超过一毫秒的程序。

Fortran版本更快的原因可能是因为循环边界是硬编码常量,所以整个计算可以在编译时完成,只留下PRINT 0在运行时。