精华 惰性求值 与 Lodash
发布于 8 年前 作者 luicfer 6935 次浏览 来自 分享

什么是惰性求值(Lazy Evaluation)

以下来自维基百科

在编程语言理论中,惰性求值(英语:Lazy Evaluation),又译为惰性计算、懒惰求值,也称为传需求调用(call-by-need),是一个计算机编程中的一个概念,它的目的是要最小化计算机要做的工作。表达式不在它被绑定到变量之后就立即求值,而是在该值被取用的时候求值,也就是说,语句如x:=expression; (把一个表达式的结果赋值给一个变量)明显的调用这个表达式被计算并把结果放置到x中,但是先不管实际在x中的是什么,直到通过后面的表达式中到x的引用而有了对它的值的需求的时候,而后面表达式自身的求值也可以被延迟,最终为了生成让外界看到的某个符号而计算这个快速增长的依赖树。

惰性求值的好处

看完上面一长段定义,来看看惰性求值的好处

看下面一个简单取余的函数

function mod (a,b){
	if(b==1) return 0;
	else return a % b ;
}

mod((1+3)*2,1)  // 0

可以看到由于 b 是 1,所以我们并不会用到 a 的值,但是依然计算了表达式(1+3)*2,这里的计算就是浪费的。惰性求值则能避免这一情况。

Lodash 的惰性求值

Lodash 在V3版本中,对chain方法引入了惰性求值大大提升了对大数组操作的性能。 以下代码是 Lodash 版本为 3.10.X

var arr = _.range(100);

var a = _.chain(arr)
	.map(function (x) {
		console.log(1);
		return x+1;
	})
	.take(10)
	.value();
//输出了100个1
//说好的惰性求值呢!

var arr = _.range(200);

var a = _.chain(arr)
	.map(function (x) {
		console.log(1);
		return x+1;
	})
	.take(10)
	.value();
//输出了10个1
//这才对嘛

Lodash 在数组超过200个才会启动惰性求值。因为惰性求值需要记录依赖,就是x -> y 的过程。

先+1*2+1*2等等等一系列步骤,记录这些步骤会造成额外的消耗。所以 Lodash 设定超过数组超过200才会启动惰性求值。在实际测试中性能平衡的阀值远不止200长度数组,当然也和操作的步数相关。

当然chain的好处不止惰性求值,还有就是你不用写这样的代码了。

_.map(_.map(arr,x=>x*x),x=>x+1) //如果有5步,你还能这样嵌套下去,我只能说我服你。

完!

回到顶部