【发布时间】:2020-09-28 13:21:02
【问题描述】:
我有两种变体来解决一个简单的问题。 问题很简单 我们必须将 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++) {
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) m 和 n 是数组的长度,但我会想知道这两种情况下的实际运行时间会有所不同,因为 approach-1 有 2 个循环(嵌套)而 approach-2 有一个循环。 我想知道编译器会如何区别对待它们。
我们也可以用一个单独的循环替换多个(2个或更多)嵌套循环,并仔细放置一些if和else,但性能会受到影响吗?
我认为大多数人都认为这个问题仅仅是复杂性问题,所以让我对此进行更多说明。 这里我们谈论的是循环优化(与机器无关),以及循环干扰,因为当存在嵌套循环时引用的局部性很差,这会导致更多时间消耗,因为在执行时(理论上)会进行大量内存切换。但是由于缺乏资源,我不确定这是否会影响上述情况。
因此,如果有人会从这个角度回答(编译器优化),我将不胜感激。
【问题讨论】:
-
@MrSmith42 如果在现代计算机上做起来那么容易,请做,并分享步骤,这将非常有帮助。
-
这就是我做不到的原因,stackoverflow.com/questions/54271755/…
标签: memory-management compiler-optimization