JS引擎可以完全优化empty empty函数吗?

时间:2019-01-25 20:37:02

标签: javascript optimization arguments

我正在开发一个框架,并且想在开发时进行一些错误检查,但是在生产时要跳过此检查。提前进行检查的原因是,例如。参数1应该始终是给定构造函数的对象。如果是这种情况,可以省略进一步的检查,例如。礼物。

在函数开始时,我要添加对

check(functionIdentifier, arguments)

的调用

在生产站点上,我将使用空检查功能来提高性能。

我已经读到,仅在需要时才应使用参数,因为JS引擎很难对其进行优化。所以我想知道,如果JS引擎能够优化,是否check是一个空函数,并且除了调用该空函数之外,为什么不使用任何参数呢? 是否存在用于动态类型检查的替代方法,这些替代方法在省略时会更快吗?

以下内容在编程过程中确实很容易出错,因为很容易造成复制粘贴失败。

check(functionIdentifier, argument1, argument2, argument3)

最糟糕的情况是缺少参数4,但undefined有效,而字符串则无效。另一个非常普遍的问题是参数输入错误

这里是一个例子:

// in main.js file
function check(){
}

function a(argument1, argument2){
  check(a, arguments);
  // ...
}

// in check.js, which is loaded after main.js and only during development
// so it replaces the check function in the window context
function check(functionIdentifier, arguments){
  switch(functionIdentifier){
    case a:
      // do some checks with arguments
      if(!ok) 
        throw new TypeErrow(/* some information */);
      break;
    case b:
      // ...
  }
}

2 个答案:

答案 0 :(得分:0)

我想说理论上可以优化空函数调用,但是大多数引擎可能不会这样做,因为在代码中具有空函数非常非常少见,因此通过这种优化无法提高性能。也许(纯粹的猜测)它将优化未使用的参数/自变量并内联函数,这将完全优化对函数的调用。但是即使那样,花在函数调用上的十亿分之一秒真的重要吗?

答案 1 :(得分:0)

我已经使用JSPerf并尝试了一些浏览器。 Chrome和Opera的优化效果非常好。 Firefox(速度降低了99%),Edge(速度降低了99%)和Safari(速度降低了96%)正在急剧降低。

标题的答案是:。一些在附近。铬。其他人相距遥远。

但是对于动态类型检查和省略它有很好的选择吗?

这里是JSPerf