绑定超出范围的变量可以加速您的代码吗?

Bai*_*ker 5 javascript bind node.js

我最近在Node JS中做了很多工作,并且重点是异步模块使我依赖于对闭包应用bind函数来将异步调用包装在循环内(以保留函数调用时变量的值)。这让我开始思考。将变量绑定到函数时,可以将传递的值添加到该函数的本地范围。因此,在Node(或通常引用超出范围变量的任何JS代码)中,将超出范围变量(例如模块)绑定到函数以便在使用时它们成为局部范围的一部分是否有利?

普通JS中的示例:

var a = 1,
    func1 = function(b) { console.log(a,b); },
    func2 = (function(a,b) { console.log(a,b); }).bind(null, a);

//func1(2) vs func2(2)
Run Code Online (Sandbox Code Playgroud)

节点中的示例

var fs = require('fs'),
    func1 = function(f) { fs.stat(f, function(err, stats){}); },
    func2 = (function(fs, f) { fs.stat(f, function(err, stats){}); }).bind(null, fs);

//func1('file.txt') vs func2('file.txt')
Run Code Online (Sandbox Code Playgroud)

在我上面的示例中,func1或func2是否会比其他示例明显更快(不包括外部因素,例如获取文件统计信息需要多长时间)?


这是我凑在一起的一个JSFiddle,它做了一个快速而肮脏的基准测试:http : //jsfiddle.net/AExvz/

  1. 谷歌浏览器14.0.797.0 dev-m
    • Func1:2-4ms
    • Func2:30-46ms
  2. Google Chrome 14.0.800.0金丝雀
    • Func1:2-7ms
    • Func2:35-39ms
  3. Firefox 5.0
    • Func1:0-1ms
    • Func2:35-42ms
  4. Opera 11.11内部版本2109
    • Func1:21-32ms
    • Func2:68-73ms
  5. Safari 5.05(7533.21.1)
    • Func1:23-34ms
    • Func2:71-78ms
  6. Internet Explorer 9.0.8112.16421
    • Func1:10-17毫秒
    • Func2:14-17毫秒
  7. 节点0.4.8 REPL
    • Func1:10ms
    • Func2:156ms @ 10倍以上的迭代(如果同时进行100000次迭代测试,则约为15.6ms)

注意: Node的REPL测试不可靠,因为它必须采用某种缓存系统。在对func1进行单个基准测试后,func2返回0ms。

随意贡献您的更好基准测试结果。

Jan*_*nen 2

一般来说,减少范围查找的效果应该是积极的。然而,对于当今快速的 JS 引擎来说,差异可能相当微小。

在旧版 JS 引擎上运行的一些数学密集型代码中,我曾经通过执行以下操作来获得更多性能:

function doSomething() {
    var round = Math.round;
    var floor = Math.floor;

    //Do something that calls floor and round a lot
}
Run Code Online (Sandbox Code Playgroud)

因此,基本上将函数从函数外部引入函数自己的作用域内可以产生积极的效果,但为了确保您可能应该分析代码以确保确定。