'recursive'属性如何影响FORTRAN90子程序的性能
How does the 'recursive' attribute affect the performance of FORTRAN90 subroutines
我正在实现一项新功能,该功能可能 会导致沿着特定代码路径递归调用相当多的子例程。
因此我必须将 recursive
属性分配给那些子例程。
我的问题是:这对那些子例程的计算时间有何影响?性能在该代码中非常重要,因此最好知道这可能产生的任何可能影响。
"proper" 答案是分析您的代码并进行测试。
根据经验,当代编译器中递归关键字对代码生成的影响主要与大型本地数组有关。对于非递归过程,这些可以放在静态数据部分(.data or.bss,取决于您平台的二进制格式),但这显然不适用于可能被递归调用的过程。因此,在那种情况下,编译器必须在分配和释放成本高昂的堆上创建这些变量,或者在任何情况下都在堆栈上创建它们,并希望用户环境没有非常小的堆栈大小限制。
顺便说一句,在即将发布的 Fortran 2015 标准草案中,递归过程已成为默认值,并且有一个新关键字 "non_recursive" 如果明确想要一个不应该的过程递归调用。
我正在实现一项新功能,该功能可能 会导致沿着特定代码路径递归调用相当多的子例程。
因此我必须将 recursive
属性分配给那些子例程。
我的问题是:这对那些子例程的计算时间有何影响?性能在该代码中非常重要,因此最好知道这可能产生的任何可能影响。
"proper" 答案是分析您的代码并进行测试。
根据经验,当代编译器中递归关键字对代码生成的影响主要与大型本地数组有关。对于非递归过程,这些可以放在静态数据部分(.data or.bss,取决于您平台的二进制格式),但这显然不适用于可能被递归调用的过程。因此,在那种情况下,编译器必须在分配和释放成本高昂的堆上创建这些变量,或者在任何情况下都在堆栈上创建它们,并希望用户环境没有非常小的堆栈大小限制。
顺便说一句,在即将发布的 Fortran 2015 标准草案中,递归过程已成为默认值,并且有一个新关键字 "non_recursive" 如果明确想要一个不应该的过程递归调用。