【发布时间】:2018-05-16 19:04:30
【问题描述】:
基于this 问题,想法是根据对象可能具有的某些属性值在对象数组中查找对象,因此我制作了这个脚本来检查哪种方法更快:
const elementsInObject = 1000000;
const lengthOfItems = 5;
//just random text
function randomText() {
var text = "";
var possible = "abcdefghijklmnopqrstuvwxyz";
for (var i = 0; i < lengthOfItems; i++)
text += possible.charAt(Math.floor(Math.random() * possible.length));
return text;
}
//ccreation of object
console.time("creatingObject");
var arrObj = [];
for (let i = 0; i < elementsInObject; i++) {
let el = {
prop1: randomText(),
prop2: randomText(),
types: [randomText(), randomText()]
};
arrObj.push(el);
}
console.timeEnd("creatingObject");
console.time("forFor");
var result = [];
for (let i = 0; i < arrObj.length; i++) {
for(let q=0; q<arrObj[i].types.length; q++){
if (arrObj[i].types[q] == "abcde") {
result.push(arrObj[i]);
}
}
}
console.timeEnd("forFor");
console.time("forIncludes");
var result = [];
for (let i = 0; i < arrObj.length; i++) {
if (arrObj[i].types.includes("abcde")) {
result.push(arrObj[i]);
}
}
console.timeEnd("forIncludes");
console.time("filterIncludes");
var result = arrObj.filter(obj => {
return obj.types.includes("abcde");
});
console.timeEnd("filterIncludes");
console.time("mapIncludes");
var result = [];
arrObj.map(obj => {
if (obj.types.includes("abcde")) {
result.push(obj);
}
});
console.timeEnd("mapIncludes");
console.time("filterIndexOf");
var result = arrObj.filter(obj => {
return obj.types.indexOf("abcde") > -1;
});
console.timeEnd("filterIndexOf");
这个想法是检查哪种方法更快且可扩展,我在这个例子中发现 for inside for 是解决这个问题的最快算法(在 node 和 chrome 中,而不是 firefox)。所以问题是:什么时候 filter() 或 map() 比 for 有更好的性能?
【问题讨论】:
-
jsperf.com 运行测试
-
arrObj[x].types,类型从何而来?
-
So the question is: When filter() or map() have better performance than for?答案是 - 如果您遇到性能瓶颈的情况,您可以运行性能测试。 -
为了什么?在绝大多数情况下,性能并不重要。如果您要检查一个包含 10 个元素的数组并且只执行一次,那么它是您应用程序中如此微不足道的一部分,以至于过早地进行微优化将不会产生任何结果。在某些情况下,JS 引擎会为您优化代码,因此甚至不可能有一个“通用”的解决方案在 100% 的时间都以相同的方式工作。此外,JS 引擎会因环境而异,甚至会因版本而异。如果 Chrome 明天优化他们的
.map,你的“通用”解决方案就会改变。停止过早优化。 -
在查看了您的测试用例之后,如果您知道自己在尝试做什么,将会有所帮助。
.map测试实际上非常糟糕,因为你在滥用.map。我只是将其更改为.forEach,并且我将执行时间减少了大约 75%(在很少的测试中,所以我可能会关闭)~200ms -> 50ms。你没有用.map做任何你不能用.forEach做的事情,事实上,你正在无缘无故地创建一个全新的数组,这就是执行时间膨胀的原因。
标签: javascript