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

发布于 2022-09-05 01:29:16 字数 1750 浏览 18 评论 0

控制台打印结果

从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>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

左岸枫 2022-09-12 01:29:16

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

还是根据楼主给的所有数据,只是在上面的 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上了,需要继续深入研究的自行取用

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文