资讯专栏INFORMATION COLUMN

惰性求值——lodash源码解读

tianren124 / 3327人阅读

摘要:本文将讲述源码中,惰性求值的原理和实现。惰性求值中的参数直到需要时才会进行计算。执行的示例图如下惰性求值做法普通的做法存在一个问题每个方法各做各的事,没有协调起来浪费了很多资源。

前言

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 惰性求值做法

普通的做法存在一个问题:每个方法各做各的事,没有协调起来浪费了很多资源。
如果能先把要做的事,用小本本记下来

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/108344.html

相关文章

  • JavaScript函数式编程(二)

    摘要:函数式编程二拖延症了好久,第二篇终于写出来了。如果你对熟悉的话应该还记得,是可以调用来集中处理错误的对于函数式编程我们也可以做同样的操作,如果运行正确,那么就返回正确的结果如果错误,就返回一个用于描述错误的结果。 JavaScript函数式编程(二) 拖延症了好久,第二篇终于写出来了。 上一篇在这里:JavaScript函数式编程(一) 上一篇文章里我们提到了纯函数的概念,所谓的纯函数...

    booster 评论0 收藏0
  • JavaScript 函数式编程(一)

    摘要:函数式编程的哲学就是假定副作用是造成不正当行为的主要原因。函数组合面向对象通常被比喻为名词,而函数式编程是动词。尾递归优化函数式编程语言中因为不可变数据结构的原因,没办法实现循环。 零、前言 说到函数式编程,想必各位或多或少都有所耳闻,然而对于函数式的内涵和本质可能又有些说不清楚。 所以本文希望针对工程师,从应用(而非学术)的角度将函数式编程相关思想和实践(以 JavaScript 为...

    hoohack 评论0 收藏0
  • JavaScript 函数式编程到底是个啥

    摘要:函数是一等公民。其实闭包本身也是函数式编程的一个应用。劣势不能算是严格意义上的函数式语言,很多函数式编程的特性并没有。 随着大前端时代的到来,在产品开发过程中,前端所占业务比重越来越大、交互越来越重。传统的老夫拿起JQuery就是一把梭应付当下重交互页面已经十分乏力。于是乎有了Angular,React,Vue这些现代框架。 但随之而来的还有大量的新知识新名词,如MVC,MVVM,Fl...

    denson 评论0 收藏0
  • JavaScript 函数式编程到底是个啥

    摘要:函数是一等公民。其实闭包本身也是函数式编程的一个应用。劣势不能算是严格意义上的函数式语言,很多函数式编程的特性并没有。 随着大前端时代的到来,在产品开发过程中,前端所占业务比重越来越大、交互越来越重。传统的老夫拿起JQuery就是一把梭应付当下重交互页面已经十分乏力。于是乎有了Angular,React,Vue这些现代框架。 但随之而来的还有大量的新知识新名词,如MVC,MVVM,Fl...

    Aomine 评论0 收藏0
  • lazy.js 惰性求值实现分析

    摘要:同时还定义了接口,使得其下级可以从这里得到一个迭代器,对于该进行遍历。迭代器在中也是一个约定的协议,实现该协议的对象要支持和两个接口方法。从迭代器的逻辑中,可以看到,当对象作为其他的上级时,如果实现上传下达。 背景:惰性求值? 来看一个 lazy.js 主页提供的示例: var people = getBigArrayOfPeople(); var results = _.chain(...

    Forelax 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<