performance - Fortran 模块性能

标签 performance module fortran

  MODULE fractions
  real*8, parameter:: one_over_three = 1.d0/3.d0
  real*8, parameter:: eleven_over_eighteen = 11.d0/18.d0
  real*8, parameter:: five_over_64 = 5.d0/64.d0
  real*8, parameter:: five_over_eight = 5.d0/8.d0
  real*8, parameter:: five_over_sixteen = 5.d0/16.d0
  real*8, parameter:: fiveteen_over_eight = 15.d0/8.d0
  real*8, parameter:: fiveteen_over_four = 15.d0/4.d0
  real*8, parameter:: fiveteen_over_two = 15.d0/2.d0
  real*8, parameter:: fortyfive_over_eight = 45.d0/8.d0
  real*8, parameter:: nine_over_two = 9.d0/2.d0
  real*8, parameter:: one_over_eight = 1.d0/8.d0
  real*8, parameter:: three_over_eight = 3.d0/8.d0
  real*8, parameter:: three_over_two = 3.d0/2.d0
  real*8, parameter:: two_over_three = 2.d0/3.d0
  real*8, parameter:: eight_over_three = 8.d0/3.d0
  real*8, parameter:: seven_over_two = 7.d0/2.d0
  END MODULE fractions

在我的 Fortran 程序中,我必须多次调用同一个子例程。它涉及几个分数。如果我使用上述模块或让程序在调用子例程并使用该模块时执行分数计算,是否会提高子例程的性能?

最佳答案

在优化编译器时这并不重要。这些分数无论出现在哪里都会被预先计算。无论您是编写 two_over_two 还是 3.d0/2.d0 或者直接说 3/2d0,性能都应该是相同的。

就我个人而言,我不会打扰这样的模块,它会影响可读性。这是个体的,局部常量通常可能有利于可读性。但我会将其保留在本地(而不是在常量的专用模块中),并且我会根据常量的用途而不是根据其值来命名常量。

注释显示了一个潜在问题,可能需要一对括号,即 x*3./2. 实际上意味着 (x*3.)/2.。我个人倾向于将这些因素放在表达式的开头,因此这不是一个问题,但最好考虑到这一点。

关于performance - Fortran 模块性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62173962/

相关文章:

MySQL INSERT INTO 查询在 C 中太慢

php - 快速高效的 PHP Session

python - 如何在包内引用 Python 中的顶级模块?

matlab - Fortran 90 中 do while 和 do while 之间的区别

performance - 如何在x86_64上准确基准未对齐的访问速度

python - 在 python 中快速计算 XMX^T 对角线的方法

python - 如何公开导入的组件?

javascript - NestJS:动态模块的缺点?

macos - MATLAB mex 不在 macOS 上寻找编译器 gfortran

python - F2PY 与具有回调参数和假定形状数组参数的子例程