控制台打印结果
从gems里面选择3个价格小于10的元素
惰性计算: 5.998ms
非惰性计算: 0.477ms
从gems2里面选择3000个价格小于10的元素
惰性计算: 5.543ms
非惰性计算: 6.443ms
源码
<script src="https://cdn.bootcss.com/lodash.js/4.17.4/lodash.min.js"></script>
<script type="text/javascript">
function priceLt(x) {
return function(item) {
return item.price < x;
};
}
var gems = [{
name: 'Sunstone',
price: 4
}, {
name: 'Amethyst',
price: 15
},
{
name: 'Prehnite',
price: 20
}, {
name: 'Sugilite',
price: 7
},
{
name: 'Diopside',
price: 3
}, {
name: 'Feldspar',
price: 13
},
{
name: 'Dioptase',
price: 2
}, {
name: 'Sapphire',
price: 20
}
];
var gems2 = _.clone(gems);
_.times(12,function() {
gems2 = _.concat(gems2,gems2);
});
console.log("从gems里面选择3个价格小于10的元素")
//惰性计算
console.time("惰性计算");
var chosen = _(gems).filter(priceLt(10)).take(3).value();
console.timeEnd("惰性计算");
//非惰性计算
console.time("非惰性计算");
var chosen2 = _.take(_.filter(gems, priceLt(10)), 3);
console.timeEnd("非惰性计算");
console.log("从gems2里面选择3000个价格小于10的元素")
//惰性计算
console.time("惰性计算");
var chosen1 = _(gems2).filter(priceLt(10)).take(3000).value();
console.timeEnd("惰性计算");
//非惰性计算
console.time("非惰性计算");
var chosen12 = _.take(_.filter(gems2, priceLt(10)), 3000);
console.timeEnd("非惰性计算");
</script>
三年过去了,楼主对上面的问题有答案了吗?
我还没想清楚,不过有个小发现,留在这儿,供后来者思考。
还是根据楼主给的所有数据,只是在上面的 priceLt() 函数内加上一个console(item),即函数变为:
然后进行运算:
1.console.log("从gems里面选择3个价格小于10的元素")
** 结果为:
2.console.log("从gems2里面选择3000个价格小于10的元素")
**结果为:
从上面两个例子就可以明显的发现,当对大量数据进行某种操作时,惰性求值比 非惰性求值 要快。
其他:
上面是我的一些小想法,其他大佬如有注意到,麻烦也写一下 其中具体的原因。
上面的代码放git上了,需要继续深入研究的自行取用。