gpt4 book ai didi

javascript - 绑定(bind)超出范围的变量可以加速您的代码吗?

转载 作者:搜寻专家 更新时间:2023-10-31 22:44:18 25 4
gpt4 key购买 nike

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

纯 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)

Node 中的例子

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')

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


这是我拼凑的一个小 JSFiddle,它可以做一个快速而肮脏的基准测试:http://jsfiddle.net/AExvz/

  1. 谷歌浏览器 14.0.797.0 dev-m
    • Func1:2-4ms
    • Func2:30-46 毫秒
  2. 谷歌浏览器 14.0.800.0 金丝雀
    • Func1:2-7ms
    • Func2:35-39 毫秒
  3. 火狐 5.0
    • Func1:0-1ms
    • Func2:35-42 毫秒
  4. Opera 11.11 Build 2109
    • 功能 1:21-32 毫秒
    • Func2:68-73 毫秒
  5. Safari 5.05 (7533.21.1)
    • 功能 1:23-34 毫秒
    • Func2:71-78 毫秒
  6. Internet Explorer 9.0.8112.16421
    • 功能 1:10-17 毫秒
    • Func2:14-17 毫秒
  7. Node 0.4.8 REPL
    • 函数 1:10 毫秒
    • Func2:156 毫秒 @ 10 倍以上的迭代(如果两者都进行了 100000 次迭代测试,则约为 15.6 毫秒)

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

随时贡献您的更好基准的结果。

最佳答案

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

在旧的 JS 引擎上运行的一些数学密集型代码中,我过去常常通过这样做来获得更多的性能:

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

//Do something that calls floor and round a lot
}

因此基本上将函数从函数外部引入到函数自身范围内可以产生积极影响,但为了确保您可能应该对代码进行概要分析以确保确定。

关于javascript - 绑定(bind)超出范围的变量可以加速您的代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6443691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com