San*_*ane 8 javascript linq performance underscore.js
根据Underscore.JS消息来源(https://github.com/jashkenas/underscore/blob/master/underscore.js):
// Start chaining a wrapped Underscore object.
chain: function() {
this._chain = true;
return this;
},
// Extracts the result from a wrapped and chained object.
value: function() {
return this._wrapped;
}
Run Code Online (Sandbox Code Playgroud)
chain()和value()函数只是Underscore对象的简单包装器.
所以,如果我使用以下构造:
_.chain(someCollection)
.map(function1)
.map(function2)
.map(function3)
.value()
Run Code Online (Sandbox Code Playgroud)
Underscore将创建两个中间集合,并将执行三个枚举.
为什么chain()和value()方法没有实现为像LINQ实现其方法的惰性求值?例如,这个链可以被视为:
_.chain(someCollection)
.map(function(x){
return function3(function2(function1(x)));
})
.value();
Run Code Online (Sandbox Code Playgroud)
这种实现有没有JS相关的问题?
Sam*_*eff 12
基本上以.chain()你描述的方式使它变得懒惰,它需要每个方法几乎有两个版本.您需要立即响应方法来执行文档所说的内容(返回一个数组),并且您需要执行延迟计算的惰性方法(返回一个期望稍后为每个元素运行的函数).
实现这一点的一种方法是将所有下划线写为惰性,并将其公开为链式下划线.然后将普通下划线暴露为惰性下划线的包装,调用惰性下划线,立即求值,然后返回结果.有两个主要问题:(1)它需要做更多的工作;(2)它是一个完全相反的架构,要求所有下划线都被编写为懒惰,只是为了支持对链方法的惰性求值.
它肯定是可行的,正如JSLinq和.NET的LINQ所展示的那样,但开发和维护的开发人员时间以及增加的复杂性和错误可能性的成本都很高.Underscore在1,200行代码中提供80种不同实用程序方法的非延迟评估.JSLinq在7,000行代码中提供了21种不同实用方法的惰性评估.代码更多,功能更少.
有一个权衡.每个开发人员都可以做出自己的决定(只要他们为自己工作).
Lazy.js是一个JavaScript实用程序库,类似于Underscore和Lo-Dash,但有一个重要区别:延迟评估(也称为延迟执行).在许多情况下,这可以转化为卓越的性能,尤其是在处理大型阵列和/或将多个方法"链接"在一起时.对于简单的情况下(
map,filter等)上的小阵列,懒惰的性能应该是相似的强调或螺短跑.
编辑:看起来Lo-Dash似乎也可以添加执行延迟评估的功能.