我觉得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
零实际意味着什么?
答案 0 :(得分:1)
在这种情况下,“零”表示“小于一毫秒”(或半毫秒,取决于它是如何舍入的),因为这是time
给出的时间分辨率。
它仅适用于测量运行时间超过一毫秒的程序。
Fortran版本更快的原因可能是因为循环边界是硬编码常量,所以整个计算可以在编译时完成,只留下PRINT 0
在运行时。