【发布时间】:2018-04-13 10:12:08
【问题描述】:
给定一个具有.length 100 的数组,其中包含在相应索引处具有值0 到99 的元素,其中要求找到等于n 的数组元素:51。
为什么使用循环从数组的开始迭代到结束比同时迭代开始到结束和结束到开始更快?
const arr = Array.from({length: 100}, (_, i) => i);
const n = 51;
const len = arr.length;
console.time("iterate from start");
for (let i = 0; i < len; i++) {
if (arr[i] === n) break;
}
console.timeEnd("iterate from start");
const arr = Array.from({length: 100}, (_, i) => i);
const n = 51;
const len = arr.length;
console.time("iterate from start and end");
for (let i = 0, k = len - 1; i < len && k >= 0; i++, k--) {
if (arr[i] === n || arr[k] === n) break;
}
console.timeEnd("iterate from start and end");
jsperfhttps://jsperf.com/iterate-from-start-iterate-from-start-and-end/1
【问题讨论】:
-
不得不询问您是否在不止一个浏览器中完成了此操作:p 您确实意识到在第二个代码的每次迭代中都会发生更多事情,对吗?额外检查
>=和||和另一个=== -
@JaromandaX 是的。 Chromium 和 Firefox 的结果相同,从头到尾迭代最快。预期的结果是从开始到结束和结束到开始比仅仅开始到结束要快,因为应该在
arr[i] === n之前达到arr[k] === n,从99到51比从0到更少的步骤51;51和48分别 -
不过,每次迭代都会发生更多事情,也许不能在运行中轻松“优化”?
-
@JaromandaX 第二个对象查找需要额外的时间吗?每个开始到结束和结束到开始是否应该有两个单独的循环?还是在两个不同的块中仍然是相同的代码?
-
老兄,我是最后一个真正询问基准测试和此类内容的人 - 如果某件事需要 101 毫秒而不是 80 毫秒,我真的不在乎:p
标签: javascript arrays performance iteration