|
|
1
9
函数调用为基于堆栈的语言(如Fortran)带来了性能成本。它们必须添加到堆栈等等。 因此,如果可能的话,大多数编译器都会尝试积极地内联函数调用。大多数情况下,编译器会在程序中是否内联某些函数上做出正确的选择。 这个自动内联过程意味着编写函数(根本)没有额外的成本。 这意味着您应该尽可能干净和有组织地编写代码,编译器很可能会为您进行这些优化。解决问题的总体策略比担心函数调用的性能更为有效,这一点更为重要。 |
|
|
2
2
只需以最简单和结构最完善的方式编写代码,然后在编写和测试代码时,可以对其进行分析,以查看是否有任何热点需要优化。只有在这一点上,您才应该关注微观优化,如果您的编译器正在做它的工作,这甚至可能是不必要的。 |
|
|
3
1
我刚刚花了一上午的时间对一个由C和Fortran混合组成的应用程序进行调优,当然它使用了很多函数。我发现(和我通常发现的)不是函数很慢,而是 某些函数调用 (而且很少有人)真的不需要做 完全 . 例如,清除内存块,只是为了保持整洁,但是要以高频率进行。 这不是语言的函数,也不是真正的内联函数。函数调用可以是 自由的 您仍然会遇到这样一个问题,即调用树往往比需要的更浓密。你需要找出修剪的地方。 This is the "profiling" method I rely on. 不管你做什么,找出需要修正的地方。不要猜。许多人不认为这类问题是猜测,但当他们发现自己在问“这会起作用吗,这会有帮助吗?”他们在黑暗中摸索,而不是 找出 问题所在。一旦他们知道问题在哪里,解决方法就显而易见了。 |
|
|
4
0
通常,Fortran中的子例程/函数调用的开销很少。虽然语言标准没有指定参数传递机制,但典型的实现是“通过引用”的,因此不涉及复制,只设置新的过程。在大多数现代建筑中,这几乎没有开销。选择好的算法通常比微观优化更重要。 关于调用be quick的一个异常可能是编译器必须创建临时数组的情况,例如,如果实际参数是非连续数组子节,而被调用过程参数是纯连续数组。假设这个伪参数是维度(:)。使用维度数组(:)调用它很简单。如果在调用中请求非单元步幅,例如数组(1:12:3),则该数组是非连续的,编译器可能需要创建临时副本。假设实际参数是dimension(:,:)。如果调用有数组(:,j),则子数组是连续的,因为在Fortran中,第一个索引在内存中变化最快,不需要复制。但是数组(i,:)是非连续的,可能需要一个临时副本。 有些编译器可以选择在需要临时数组副本时警告您,以便您可以根据需要更改代码。 |
|
|
giantjenga · 优化整数向量到二进制向量的转换 1 年前 |
|
|
Daniel Lobo · 使用约束进行优化 1 年前 |
|
Sergio · python中大量数字的乘法 2 年前 |
|
|
Sergey Dev · 临时表与表变量 2 年前 |
|
|
John · 减少C中的内存消耗++ 2 年前 |