我正在开发一个框架,并且想在开发时进行一些错误检查,但是在生产时要跳过此检查。提前进行检查的原因是,例如。参数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:
// ...
}
}
答案 0 :(得分:0)
我想说理论上可以优化空函数调用,但是大多数引擎可能不会这样做,因为在代码中具有空函数非常非常少见,因此通过这种优化无法提高性能。也许(纯粹的猜测)它将优化未使用的参数/自变量并内联函数,这将完全优化对函数的调用。但是即使那样,花在函数调用上的十亿分之一秒真的重要吗?
答案 1 :(得分:0)
我已经使用JSPerf并尝试了一些浏览器。 Chrome和Opera的优化效果非常好。 Firefox(速度降低了99%),Edge(速度降低了99%)和Safari(速度降低了96%)正在急剧降低。
标题的答案是:否。一些在附近。铬。其他人相距遥远。
但是对于动态类型检查和省略它有很好的选择吗?
这里是JSPerf