lodash链式计算(惰性计算)反而更慢一点?

控制台打印结果

从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>
阅读 2.8k
2 个回答

三年过去了,楼主对上面的问题有答案了吗?
我还没想清楚,不过有个小发现,留在这儿,供后来者思考。

还是根据楼主给的所有数据,只是在上面的 priceLt() 函数内加上一个console(item),即函数变为:

  function priceLt(x) {
        let index =0;
        return function(item) {
            console.log(item, index++)
            return item.price < x;
        };
    }

然后进行运算:
1.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("非惰性计算");

** 结果为:

第一次:
惰性计算: 2.0498046875 ms
非惰性计算: 3.575927734375 ms**
第二次:
惰性计算: 1.837890625 ms
非惰性计算: 0.9111328125 ms

在较少数据计算中,每次计算各有大小,无恒定差异

2.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("非惰性计算");

**结果为:

第一次:
惰性计算: 1254.908935546875 ms
非惰性计算: 3736.450927734375 ms**
第二次:
惰性计算: 1279.892822265625 ms
非惰性计算: 4114.26904296875 ms

在较大数据的计算结果中, 惰性计算都比非惰性计算耗时要少

从上面两个例子就可以明显的发现,当对大量数据进行某种操作时,惰性求值比 非惰性求值 要快。

其他:
上面是我的一些小想法,其他大佬如有注意到,麻烦也写一下 其中具体的原因。
上面的代码放git上了,需要继续深入研究的自行取用

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏