代码之家  ›  专栏  ›  技术社区  ›  Samizdis

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

  •  5
  • Samizdis  · 技术社区  · 16 年前

    我习惯于用很多函数编写代码,我发现它更清晰。但是现在我正在用fortran编写一些代码,这些代码需要非常高效,我想知道过度使用函数是否会减慢速度,或者编译器是否能解决问题并优化?

    我在Java/Python等中知道,每个函数都是一个对象,因此创建很多函数将需要它们在内存中创建。我也知道,在haskell中,函数是互相简化的,所以在这里没有什么区别。

    有人知道Fortran的案子吗?使用intent/pure函数/声明更少的局部变量/还有什么不同吗?

    4 回复  |  直到 16 年前
        1
  •  9
  •   KLee1    16 年前

    函数调用为基于堆栈的语言(如Fortran)带来了性能成本。它们必须添加到堆栈等等。

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

    这个自动内联过程意味着编写函数(根本)没有额外的成本。

    这意味着您应该尽可能干净和有组织地编写代码,编译器很可能会为您进行这些优化。解决问题的总体策略比担心函数调用的性能更为有效,这一点更为重要。

        2
  •  2
  •   Paul R    16 年前

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

        3
  •  1
  •   Community Mohan Dere    9 年前

    我刚刚花了一上午的时间对一个由C和Fortran混合组成的应用程序进行调优,当然它使用了很多函数。我发现(和我通常发现的)不是函数很慢,而是 某些函数调用 (而且很少有人)真的不需要做 完全 . 例如,清除内存块,只是为了保持整洁,但是要以高频率进行。

    这不是语言的函数,也不是真正的内联函数。函数调用可以是 自由的 您仍然会遇到这样一个问题,即调用树往往比需要的更浓密。你需要找出修剪的地方。 This is the "profiling" method I rely on.

    不管你做什么,找出需要修正的地方。不要猜。许多人不认为这类问题是猜测,但当他们发现自己在问“这会起作用吗,这会有帮助吗?”他们在黑暗中摸索,而不是 找出 问题所在。一旦他们知道问题在哪里,解决方法就显而易见了。

        4
  •  0
  •   M. S. B.    16 年前

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

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

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