【问题标题】:Compiler memory allocation difference for nested loop against single loop嵌套循环与单循环的编译器内存分配差异
【发布时间】:2020-09-28 13:21:02
【问题描述】:

我有两种变体来解决一个简单的问题。 问题很简单 我们必须将 pow2 的每个元素与 pow3 的每个元素相乘,其中 pow2pow3 都是带有整数的数组.

代码在 javascript (Node.js) 中。 我在这里将两个数组都保留为空,我们可以在运行时用不同的数字填充它们。

第一个:-

let pow3 = [], pow2 = [];
for (let i = 0; i < pow3.length; ++i) {
    for (let j = 0; j < pow2.length; j++) {
        let result = pow3[i] * pow2[j];
    }
}

第二:-

let pow3 = [], pow2 = [];
let j = 0, i = 0;
for (;;) {
    let result = pow3[i] * pow2[j];
    if (++i === pow3.length) {
        i = 0;
        j++;
    }
    if (j === pow2.length)
        break;
}

如果在两个方法中计算时间复杂度是相同的,即 O(m*n) mn 是数组的长度,但我会想知道这两种情况下的实际运行时间会有所不同,因为 approach-1 有 2 个循环(嵌套)而 approach-2 有一个循环。 我想知道编译器会如何区别对待它们。

我们也可以用一个单独的循环替换多个(2个或更多)嵌套循环,并仔细放置一些if和else,但性能会受到影响吗?

我认为大多数人都认为这个问题仅仅是复杂性问题,所以让我对此进行更多说明。 这里我们谈论的是循环优化(与机器无关),以及循环干扰,因为当存在嵌套循环时引用的局部性很差,这会导致更多时间消耗,因为在执行时(理论上)会进行大量内存切换。但是由于缺乏资源,我不确定这是否会影响上述情况。

因此,如果有人会从这个角度回答(编译器优化),我将不胜感激。

【问题讨论】:

标签: memory-management compiler-optimization


【解决方案1】:

在您学习一些真正疯狂的算法(FFT 或快速傅里叶变换,将能够在 O((m+k)log(m+k)) 中做到这一点,但这是非常先进的)之前,您的第一种方法是您可以做的最好的一段时间。 .第二种方法具有相同的时间复杂度,但更难追踪。

影响时间复杂度的不是循环的数量,而是它们相对于问题范围的执行次数。在第二种方法中,您只有一个循环,但为了补偿该循环运行nm 次。

【讨论】:

  • 感谢您的回复 :) 我认为大多数人都认为这个问题仅仅是复杂性问题,所以让我对此进行更多说明。这里我们谈论的是循环优化(与机器无关),以及循环干扰,因为当嵌套循环存在时引用的局部性很差,这会导致更多时间消耗,因为在执行时(理论上)会进行大量内存切换。但由于缺乏资源,我不确定这是否会影响上述情况。
猜你喜欢
  • 2021-07-18
  • 1970-01-01
  • 2015-06-05
  • 2016-05-13
  • 2019-11-13
  • 1970-01-01
  • 2021-05-30
  • 2017-11-05
  • 1970-01-01
相关资源
最近更新 更多