Performance 内部职能的履行

Performance 内部职能的履行,performance,fortran,Performance,Fortran,有没有理由相信fortran内部函数比外部函数性能更好 e、 g vs 例如,内部单元是否允许编译器像某种宏那样内联代码?我不认为有任何一般理由相信Fortran内部函数比外部函数性能更好。一般来说,我指的是适用于所有平台上所有符合Fortran标准的编译器。因此,我不认为人们可以从性能的角度(在同样的意义上)表达出对内部功能的普遍偏好 我将更进一步,我不相信语言标准(其中任何一个标准)中有太多东西能够很好地支持关于实现相同功能的各种方法的相对性能的论点。因此,再举一个例子,我认为该标准不允许有

有没有理由相信fortran内部函数比外部函数性能更好

e、 g

vs


例如,内部单元是否允许编译器像某种宏那样内联代码?

我不认为有任何一般理由相信Fortran内部函数比外部函数性能更好。一般来说,我指的是适用于所有平台上所有符合Fortran标准的编译器。因此,我不认为人们可以从性能的角度(在同样的意义上)表达出对内部功能的普遍偏好

我将更进一步,我不相信语言标准(其中任何一个标准)中有太多东西能够很好地支持关于实现相同功能的各种方法的相对性能的论点。因此,再举一个例子,我认为该标准不允许有人认为显式
do
循环应该优于等效的基于数组语法的表达式。或者提出相反的论点

但我确实相信,出于性能考虑,可能会有一些特定于编译器版本和/或平台的原因,让我们更倾向于使用一种方法而不是另一种方法。例如,上次我在英特尔处理器上的MS Windows上测试英特尔Fortran编译器(可能是v11.something)时,我得出的结论是显式
do
循环通常比等效的数组语法表达式执行得更好

由于性能通常是Fortran程序员关注的一个关键问题,因此我们有责任在编译器开发过程中监控各种方法的性能,而不是被过时的性能思想所束缚


和往常一样,在这个游戏中,硬数据胜过论证。程序性能是一门实验科学。

我不认为有任何一般理由相信Fortran内部函数比外部函数性能更好。一般来说,我指的是适用于所有平台上所有符合Fortran标准的编译器。因此,我不认为人们可以从性能的角度(在同样的意义上)表达出对内部功能的普遍偏好

我将更进一步,我不相信语言标准(其中任何一个标准)中有太多东西能够很好地支持关于实现相同功能的各种方法的相对性能的论点。因此,再举一个例子,我认为该标准不允许有人认为显式
do
循环应该优于等效的基于数组语法的表达式。或者提出相反的论点

但我确实相信,出于性能考虑,可能会有一些特定于编译器版本和/或平台的原因,让我们更倾向于使用一种方法而不是另一种方法。例如,上次我在英特尔处理器上的MS Windows上测试英特尔Fortran编译器(可能是v11.something)时,我得出的结论是显式
do
循环通常比等效的数组语法表达式执行得更好

由于性能通常是Fortran程序员关注的一个关键问题,因此我们有责任在编译器开发过程中监控各种方法的性能,而不是被过时的性能思想所束缚


和往常一样,在这个游戏中,硬数据胜过论证。程序性能是一门实验科学。

对于可能引起争议的事情。。。这意味着,在标准中,内部程序“执行”比外部程序更好,但不是你(可能)的意思

内部过程和模块过程获得自动显式接口。这要求编译器检查每个过程引用的某些方面,并使大多数不太体面的编译器能够检查许多其他方面。通过外部程序实现相同级别的检查需要手动提供接口,这很容易出错

在一般情况下,由自动显式接口产生的程序健壮性好处(很大程度上是一种性能形式)消除了任何“执行速度”性能方面的考虑因素,这些考虑因素现在最多归结为“视情况而定”/“您需要测量以发现”/“可能没有区别”对于任何体面的编译器

在这种情况下,将bar(和foo)作为一个模块过程可能会更好,因为它消除了变量与foo的意外主机关联,并支持对bar的独立测试


程序类型的选择应基于源代码的技术要求(在现代Fortran代码库中,编写外部程序的正当理由仍然存在,但它们是非典型的),然后是模块提供的源代码与内部过程提供的源代码的健壮性和清晰性之间的权衡。如果您在这个决定中需要考虑执行性能的速度,那么您的编译器就坏了。

对于可能有争议的事情。。。这意味着,在标准中,内部程序“执行”比外部程序更好,但不是你(可能)的意思

内部过程和模块过程获得自动显式接口。这要求编译器检查每个过程引用的某些方面,并使大多数不太体面的编译器能够检查许多其他方面。通过外部程序实现相同级别的检查需要手动提供接口,这很容易出错

在一般情况下,由自动显式接口产生的程序健壮性好处(很大程度上是一种性能形式)消除了任何“执行速度”性能方面的考虑因素,这些考虑因素现在最多归结为“视情况而定”/“您需要测量以发现”/“可能没有任何差异”
subroutine foo(x,y)
   real :: x
   x = bar(y)
   return
   contains
   real function bar(x)
      real :: x
      bar = x*x
      return
   end function bar
end subroutine foo
subroutine foo(x,y)
   real :: x
   real :: bar
   x = bar(y)
   return
end subroutine foo

real function bar(x)
   real :: x
   bar = x*x
   return
end function bar