mips中迭代和递归方法之间的性能差异
performance differences between iterative and recursive method in mips
我有 2 个版本的程序必须分析。一种是递归的,另一种是迭代的。我必须比较两者的缓存命中率并检查两种方法的性能及其指令数
对于这两种方法,无论块设置如何,迭代方法的内存访问量大约减少 100。都触发 2 次失误。如果我将设置设置为 1 个大小为 256 的块,我只能将缓存命中率降低到 85%。
对于指令计数,迭代大约少了 1000 条指令
有人可以向我解释为什么会发生这种情况,或者提供一些我可以阅读的文献,但我似乎找不到任何东西。我只想大致了解一下为什么会发生这种情况。
从这个问题中获取了一些信息:Recursion or Iteration? 以及一些来自 McGill 的 COMP 273 中的信息,我假设您也在其中,这就是您提问的原因。
每个递归调用通常需要将该调用的 return 地址压入堆栈;在 MIPS(汇编)中,这必须手动完成,否则 return 地址会被每个 jal 覆盖。因此,通常 更多缓存 space 用于递归解决方案,因此内存访问次数更高。在迭代解决方案中,这完全没有必要。
我有 2 个版本的程序必须分析。一种是递归的,另一种是迭代的。我必须比较两者的缓存命中率并检查两种方法的性能及其指令数
对于这两种方法,无论块设置如何,迭代方法的内存访问量大约减少 100。都触发 2 次失误。如果我将设置设置为 1 个大小为 256 的块,我只能将缓存命中率降低到 85%。
对于指令计数,迭代大约少了 1000 条指令
有人可以向我解释为什么会发生这种情况,或者提供一些我可以阅读的文献,但我似乎找不到任何东西。我只想大致了解一下为什么会发生这种情况。
从这个问题中获取了一些信息:Recursion or Iteration? 以及一些来自 McGill 的 COMP 273 中的信息,我假设您也在其中,这就是您提问的原因。
每个递归调用通常需要将该调用的 return 地址压入堆栈;在 MIPS(汇编)中,这必须手动完成,否则 return 地址会被每个 jal 覆盖。因此,通常 更多缓存 space 用于递归解决方案,因此内存访问次数更高。在迭代解决方案中,这完全没有必要。