Optimization 过度使用函数调用会影响性能吗?特别是在Fortran中

Optimization 过度使用函数调用会影响性能吗?特别是在Fortran中,optimization,fortran,function-calls,Optimization,Fortran,Function Calls,我习惯性地编写包含很多函数的代码,我发现这会使代码更清晰。但现在我正在用Fortran编写一些需要非常高效的代码,我想知道过度使用函数是否会降低速度,或者编译器是否会解决问题并进行优化 我知道在Java/Python等语言中,每个函数都是一个对象,因此创建大量函数需要在内存中创建它们。我还知道,在Haskell中,函数被简化为彼此的函数,因此在这里没有什么区别 有人知道Fortran的情况吗?使用意图/纯函数/声明更少的局部变量/其他任何东西有什么区别吗?只需以最简单、结构最完善的方式编写代码,

我习惯性地编写包含很多函数的代码,我发现这会使代码更清晰。但现在我正在用Fortran编写一些需要非常高效的代码,我想知道过度使用函数是否会降低速度,或者编译器是否会解决问题并进行优化

我知道在Java/Python等语言中,每个函数都是一个对象,因此创建大量函数需要在内存中创建它们。我还知道,在Haskell中,函数被简化为彼此的函数,因此在这里没有什么区别


有人知道Fortran的情况吗?使用意图/纯函数/声明更少的局部变量/其他任何东西有什么区别吗?

只需以最简单、结构最完善的方式编写代码,然后在编写和测试代码后,您就可以对其进行分析,以查看是否存在需要优化的热点。只有在这一点上,您才应该关注微优化,如果您的编译器正在执行它的工作,这甚至可能不是必需的。

函数调用会为基于堆栈的语言(如Fortran)带来性能代价。它们必须添加到堆栈中,等等

因此,如果可能的话,大多数编译器都会积极尝试内联函数调用。大多数情况下,编译器会正确选择是否在程序中内联某些函数

这种自动内联过程将意味着编写函数不会产生额外的成本


这意味着您应该尽可能干净、有序地编写代码,而且编译器很可能会为您进行这些优化。更重要的是,解决问题的总体策略是最有效的,而不是担心函数调用的性能。

通常Fortran中的子例程/函数调用的开销很小。虽然语言标准没有指定参数传递机制,但典型的实现是“通过引用”,因此不涉及复制,只需设置一个新过程。在大多数现代建筑中,这几乎没有开销。选择好的算法通常比微观优化重要得多

调用be quick的例外情况可能是编译器必须创建临时数组,例如,如果实际参数是非连续数组子部分,而被调用的过程参数是纯连续数组。假设伪参数是维度(:)。用维度(:)数组调用它很简单。如果在调用中请求非单位跨步,例如数组(1:12:3),则该数组是非连续的,编译器可能需要创建临时副本。假设实际参数是维度(:,:)。如果调用具有数组(:,j),则子数组是连续的,因为在Fortran中,第一个索引在内存中变化最快,不需要副本。但数组(i,:)是非连续的,可能需要一个临时副本


有些编译器可以在需要临时数组副本时向您发出警告,以便您可以根据需要更改代码。

我刚刚花了一上午的时间调试了一个由C和Fortran混合而成的应用程序,当然它使用了很多函数。我发现(以及我通常发现的)并不是函数速度慢,而是某些函数调用(而且很少)实际上根本不需要完成。例如,清除内存块,只是为了保持整洁,但这样做的频率很高

这不是语言的功能,也不是内联的功能。函数调用可能是免费的,但仍然存在调用树过于繁杂的问题。你需要找到修剪的地方


无论你做什么,找出需要解决的问题。别猜了。许多人不认为这类问题是猜测,但当他们发现自己在问“这行得通吗,那有用吗?”时,他们只是在暗中摸索,而不是找出问题所在。一旦他们知道问题出在哪里,问题就显而易见了。

在Java中,每个函数以什么方式成为对象?调用函数不会创建对象。。。它可能在Python中运行,但我对此表示怀疑。(您可以通过反射获取Java中方法的表示,但这不是一回事。)抱歉,这不是很清楚。我指的是Java(和Python)中的匿名函数需要创建并存储在内存中的方式,这非常耗时。如果我的函数中的所有局部变量每次都需要为它们创建/分配内存,那么使用更少的函数可能是值得的,但是如果它们一开始就分配了内存,那么可能没有多大区别。在内存中称它们为“对象”是一个糟糕的选择(尽管我认为它们实际上是在Python中)。局部变量在一条指令中创建,如果它们在堆栈上,则在一条指令中删除。“我们应该忘记小效率,比如说大约97%的时间:过早优化是万恶之源。”--Donald Knuthy你当然是对的,但有一点人们忽略了。这些都是相对的,不只是快或慢。当一个例程进入和退出时,它有一大堆事情要做。如果它花费的时间超过了总时间的5%,比如它调用的例程通常可以做一些复杂的事情,但通常做的很少,那么样本应该会找到它,并进行一些更改。《拉帕克》中的LSAME通常只是比较两个角色,但那个家伙太引人注目了。