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

时间:2015-01-08 07:53:45

标签: javascript performance optimization

在javascript函数中使用未使用的参数会降低执行速度吗?它占用了记忆吗?我经常使用从未实际使用的参数编写函数,例如,函数将事件作为参数,但事件从不用于任何事情。

4 个答案:

答案 0 :(得分:4)

  

减慢执行速度?

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

  

是否会占用内存?

但就内存分配而言,它们通常被分配Lexical Environment

  

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

所以对于以下功能:

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

因此,当您将其作为sayHi()调用时,词汇envirmonemt看起来像:

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

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

  

当解释器准备启动功能代码执行时,   在第一行运行之前,会创建一个空的 LexicalEnvironment   和填充参数,局部变量和嵌套函数。

答案 1 :(得分:1)

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

function test() {
    console.log(arguments)
}

test('these','are','passed')

//logs ["these','are',passed']

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

答案 2 :(得分:0)

  

在javascript函数中使用未使用的参数会降低执行速度吗?

可能不适用于现代引擎(它消除了琐碎的死代码)。无论如何,在堆栈上分配变量便宜

  

是否会占用内存?

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

  

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

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

答案 3 :(得分:0)

我对这个问题的一个子集很感兴趣:生成未使用参数的代码是否被评估?我的用例是用于调试日志消息:当我将日志级别设置为小于“debug”时,是否会在调试代码中放慢我的脚本?我在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%ops / sec

有条件地评估

30,326,171±5.55%ops / sec