在函数中做未使用的参数会减慢 JavaScript 的执行速度

Do unused paramenters in functions slow down the execution of JavaScript?

本文关键字:JavaScript 速度 执行 参数 函数 未使用      更新时间:2023-09-26

javascript函数中使用未使用的参数会减慢执行速度吗?它会占用内存吗?我经常使用从未实际使用的参数编写函数,例如函数将事件作为参数,但该事件从未用于任何事情。

减慢执行速度?

运行时间取决于对输入执行的操作。可以是搜索或排序或任何简单的操作。操作的运行时间决定了其执行速度。因此,当您不传递任何参数时,这意味着不会对该参数执行任何操作,因此运行时间是稳定的。

它会占用内存吗?

但就内存分配而言,它们通常被分配一个词汇环境。

当函数运行时,在每次函数调用时,新的 创建并填充参数LexicalEnvironment, 变量和嵌套函数声明。

所以对于下面的函数:

function sayHi(name) {
/* LexicalEnvironment = { name: passedvalue, 
                        phrase: undefined }*/  // created at this point.
  var phrase = "Hi, " + name
  alert(phrase)
}

因此,当您将其调用为 sayHi() 时,词汇环境如下所示:

LexicalEnvironment = { name: undefined, phrase: undefined};

因此,当解释器解释函数时,每个参数和函数变量都会被分配内存。

当解释器准备开始函数代码执行时, 在运行第一行之前,将创建一个空的词法环境填充了参数、局部变量和嵌套函数。

JavaScript 无论如何都会存储发送到 arguments 数组中每个函数的参数,无论您为它们分配局部变量。

function test() {
    console.log(arguments)
}
test('these','are','passed')
//logs ["these','are',passed']

我的观点是,未使用的参数无论如何都会占用内存,您只是使用另一个变量名称引用它们。

在 JavaScript 函数中使用未使用的参数会减慢执行速度吗?

可能不是在现代引擎中(这是微不足道的死代码消除)。无论如何,在堆栈上分配变量很便宜

它会占用内存吗?

至少有几个字节用于将函数的主体保存为字符串。

我经常使用从未实际使用的参数编写函数,例如函数将事件作为参数,但该事件从未用于任何事情。

您不应该在没有基准测试的情况下关心微优化。不要试图超越编译器,V8和SpiderMonkey在优化代码方面做得很好。

我对这个问题的一个子集感兴趣:生成未使用参数的代码是否经过评估? 我的用例是调试日志消息:当我将日志级别设置为低于"调试"的值时,保留调试代码是否会减慢我的脚本速度? 我在 https://jsperf.com/log-parameters/1 进行了基准测试以找出答案。 这表明代码已经过评估,并且确实减慢了脚本的速度。

测试说明

准备代码

Benchmark.prototype.setup = function() {
  var generate_message = function() {
    // Do some calculations to generate a dummy message.
    var s = ''
    for (var i = 1; i < 512; i++) {
      var a = Math.random()
      var b = Math.random()
      s += String.fromCharCode(48 + Math.floor(128*a*b))
    }
    return s
  }
  var Log = {
    level: 1, /* 1 = FATAL, 4 = DEBUG */
    fatal: function(msg) {this.log(1, msg)},
    debug: function(msg) {this.log(4, msg)},
    log: function(lvl, msg) {
           if (lvl <= this.level) {
             if (typeof msg === 'function') msg = msg()
             console.log([new Date(), lvl, msg].join('::'))
           }
         },
  }
};

测试 1:始终评估

Log.debug(generate_message())

测试 2:有条件评估

Log.debug(generate_message)

结果

始终评估

36,047 ±1.45% 操作/秒

有条件评估

30,

326,171 ±5.55% 操作/秒