Memory management 嵌套循环与单个循环的编译器内存分配差异

Memory management 嵌套循环与单个循环的编译器内存分配差异,memory-management,compiler-optimization,Memory Management,Compiler Optimization,我有两种做简单问题的方法。 问题很简单 我们必须将pow2的每个元素与pow3的每个元素相乘,其中pow2和pow3都是带整数的数组 代码是用javascript(Node.js)编写的。 我将两个数组都保留为空,我们可以在运行时用不同的数字填充它们 第一个: let pow3 = [], pow2 = []; for (let i = 0; i < pow3.length; ++i) { for (let j = 0; j < pow2.length; j++) {

我有两种做简单问题的方法。 问题很简单 我们必须将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];
    }
}
现在,如果计算两种方法的时间复杂度相同,即O(m*n)m和n是数组的长度,但我想知道的是,在这两种情况下,实际运行时间会不同,因为方法1有2个循环(嵌套),而方法2有一个单循环。 我想知道编译器将如何区别对待它们

此外,我们还可以用单个循环替换多个(2个或更多)嵌套循环,其中一些循环被小心地放置在if和else中,但性能是否会受到影响

我想大多数人都把这个问题看作是一个复杂的问题,所以让我补充一些关于这个问题的澄清。 这里我们讨论的是循环优化(独立于机器),也就是说循环干扰,因为当存在嵌套循环时,引用的局部性很差,这会导致更多的时间消耗,因为在执行时(理论上)会产生大量内存开关。但由于缺乏资源,我不确定这是否会影响上述情景


因此,如果有人能从这个角度回答(编译器优化),我将非常感激

在学习一些真正疯狂的算法(FFT或快速傅立叶变换,将能够在
O((m+k)log(m+k))
中实现这一点)之前,您的第一种方法是您能够做到的最好的方法。第二种方法具有相同的时间复杂性,但更难跟踪


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

@MrSmith42如果在现代计算机上很容易做到,请做到这一点,并请分享步骤,这将非常有帮助。以下是我无法做到的原因,谢谢你的回答:)我想大多数人认为这个问题仅仅是一个复杂的问题,所以让我补充一些关于这个问题的澄清。这里我们讨论的是循环优化(与机器无关)以及循环干扰,因为当嵌套循环存在时,引用的局部性很差,这会导致更多的时间消耗,因为在执行时(理论上)会产生大量内存开关。但由于缺乏资源,我不确定这是否会影响上述情景。
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;
}