博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
惰性求值—lodash源码解读
阅读量:2290 次
发布时间:2019-05-09

本文共 1348 字,大约阅读时间需要 4 分钟。

lodash受欢迎的一个原因,是其优异的计算性能。而其性能能有这么突出的表现,很大部分就来源于其使用的算法——惰性求值。 本文将讲述lodash源码中,惰性求值的原理和实现。

 

一、惰性求值的原理分析

惰性求值(Lazy Evaluation),又译为惰性计算、懒惰求值,也称为传需求调用(call-by-need),是计算机编程中的一个概念,它的目的是要最小化计算机要做的工作。 惰性求值中的参数直到需要时才会进行计算。这种程序实际上是从末尾开始反向执行的。它会判断自己需要返回什么,并继续向后执行来确定要这样做需要哪些值。

以下是How to Speed Up Lo-Dash ×100? Introducing Lazy Evaluation.(如何提升Lo-Dash百倍算力?惰性计算的简介)文中的示例,形象地展示惰性求值。

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 chosen = _(gems).filter(priceLt(10)).take(3).value();复制代码

程序的目的,是对数据集gems进行筛选,选出3个price小于10的数据。

1.1 一般的做法

如果抛开lodash这个工具库,让你用普通的方式实现var chosen = _(gems).filter(priceLt(10)).take(3);那么,可以用以下方式:

_(gems)拿到数据集,缓存起来。
再执行filter方法,遍历gems数组(长度为10),取出符合条件的数据:

[   { name: 'Sunstone', price: 4 },   { name: 'Sugilite', price: 7  },   { name: 'Diopside', price: 3 },   { name: 'Dioptase', price: 2 }]复制代码

然后,执行take方法,提取前3个数据。

[   { name: 'Sunstone', price: 4 },   { name: 'Sugilite', price: 7  },   { name: 'Diopside', price: 3 }]复制代码

总共遍历的次数为:10+3。 执行的示例图如下:

 

普通计算

 

1.2 惰性求值做法

普通的做法存在一个问题:每个方法各做各的事,没有协调起来浪费了很多资源。

如果能先把要做的事,用小本本记下来

转载地址:http://fobnb.baihongyu.com/

你可能感兴趣的文章
Windows Mobile 开发书籍介绍
查看>>
Cocos2d-x开发-横屏
查看>>
cocos2dx的lua绑定
查看>>
sublime text
查看>>
I/O并发模式:Reactor模式与Proactor模式
查看>>
Game - datastructure
查看>>
C++多进程并发框架FFLIB
查看>>
C++ 后台程序实时性能监控
查看>>
(2013&2012Windows编程+网络编程)360、腾讯、迅雷面试题及答案
查看>>
并行编程中的设计模式
查看>>
切换进程 切换线程
查看>>
NT4源码编译环境
查看>>
dll和so文件区别与构成
查看>>
android动态加载.so,实现动态库升级
查看>>
coco2d-x 纹理研究
查看>>
cocos2d-x 纹理深入研究 第二部分
查看>>
cocos2d-x游戏开发系列教程-坦克大战游戏之虚拟手柄的显示
查看>>
天龙八部服务器端共享内存的设计
查看>>
游戏对象的实现
查看>>
游戏Entity设计不完全整理(转)
查看>>