我正在使用已升级到F9X的旧F77代码。它仍然有一些较旧的“遗留”代码结构,我对以传统方式或现代方式添加代码的性能方面感到好奇。我们有一个单独的F9x代码,我们正在尝试将它们集成到这个旧代码中,尽可能多地使用它们的程序,而不是重写我们自己的版本。另请注意,假设所有这些过程都未明确接口。
具体来说,旧代码具有一个在主程序中分配的大型rank-1工作数组,并且当该数组更深入地传递到过程中时,它被拆分并在需要的地方使用。本质上有一个分配/释放,这个数组的唯一开销包括找到所需临时数组的起始索引(平凡)并将工作数组的这些部分传递给过程。
我们的新代码通常使用旧代码中的低级过程,其中多个虚拟数组源自旧代码的全局工作数组。而不是创建我们自己的工作数组,找到起始索引,并使用它们的起始索引传递所有这些数组部分的麻烦,我可以在需要它们的地方创建动态分配的数组。但是,在代码执行期间,这些过程可以被称为数千个(对于某些较低级别的例程可能是数百万个),并且我担心每次使用这些过程时分配和解除分配的开销。此外,这些临时数组可能包含数百万个双精度元素。
我还涉及自动数组但在我遇到堆栈溢出问题时停止了,现在几乎只使用动态数组。关于如何存储不同类型数组的内存,我听说过有关堆栈和堆的不同内容,但我真的不知道差异哪个更好(性能,效率等)。
长话短说,由于开销问题,这些动态分配(或自动)阵列的效率会大大降低吗?我也意识到动态分配的数组在代码的生命周期中更加健壮,但我真正追求的是性能。性能提升5%可能意味着代码执行可以节省很多时间。
我意识到由于编译器优化和其他因素的差异,我可能无法得到明确的答案,但我很好奇是否有人可能对类似的东西有一些知识/经验。谢谢你的帮助。
答案 0 :(得分:4)
我认为任何答案都将是猜测和推测。我的猜测:阵列创建将是一个非常低的CPU负载。除非这些子例程的计算量可以忽略不计,否则不同数组类型的不同开销将不会引人注意。但唯一可以确定的方法是尝试两种不同的方法并对它们进行计时,例如,使用Fortran内在的cpu_time。
自动数组通常放在堆栈上,但是一些编译器会在堆上放置大型自动数组。某些编译器可以选择更改此行为。可分配的可能在堆上。