gpt4 book ai didi

javascript - JavaScript 会自动跳过空函数吗?

转载 作者:行者123 更新时间:2023-12-02 23:27:56 24 4
gpt4 key购买 nike

包含“tl;dr”

当尝试禁用日志记录以避免部署后出现垃圾邮件时,我曾经做过类似的事情

if (isDebug)
console.log(...);

但我觉得(或在线阅读)这会减慢代码的整体速度,因为每次都会评估条件(我通常会包含很多这样的条件,并且经常通过循环、setIntervals 或 w 调用这些函数)/e)。

因此,我现在转而使用自定义记录器简单地“清空”函数,例如

function LOGGER_MODULE_FACTORY() {
let current_log_level = "log";
return {
log: console.log,
info: console.info,
warn: console.warn,
error: console.error,
setDebug: function(logLevel) {
current_log_level = logLevel;
this.log = (logLevel === true || logLevel === "log") ? console.log : function () {};
this.info = (logLevel === true || logLevel === "log" || logLevel === "info") ? console.info : function () {};
this.warn = (logLevel === true || logLevel === "log" || logLevel === "info" || logLevel === "warn") ? console.warn : function () {};
this.error = (!logLevel) ? function () {} : console.error;
return logLevel;
},
getCurrent_log_level: function () { return current_log_level; }
}
}

认为运行空函数可能比计算表达式更快,而且写起来感觉更干净。

我尝试创建 fiddle测试我的理论并比较性能,但值通常相当随机......

编辑:jsperf test有趣的结果。 “Chrome 64”的结果来自在 Edge 上运行。

我的推理依赖于这样一个事实:我读过一些有关 CPU 的内容,显然,它们会自己做一些事情来优化一般运行时,例如跳过无用的操作:假设我们有:

a = x
b = y
c = a + 3

CPU 实际上会忽略第二行(或者其他什么......我远不是专家啊,我只是好奇地读到了这个事实)。

现在,由于我们在浏览器上可以使用控制台在某个时刻访问任何全局声明的变量,所以这种情况不会发生,所以我觉得我应该简单地在线询问:

tl;博士:

重复调用空/无实体函数(我创建的页面基本上在仪表板上 24/7 运行)在性能方面比在原始函数前面放置条件更好(console.log/info/警告/错误) ?

Basically, you are asking which is faster f = () => {}; f() or flag = false; if (flag) f()

最佳答案

isDebug 不会在每次执行时进行评估,但只会读取存储的变量。

如果是if (isDebug())则会有所不同,在这种情况下,每次解析器遇到该语句时,都会对函数进行求值。

显然,读取 isDebug bool 变量会增加一些开销,但这并不明显,因为读取和处理变量是编程语言的主要目的,因此读取 bool 值所需的时间将始终低于代码中的任何其他语句。

重新分配 console.log 函数并不是一个坏主意,它对于一次启用或禁用所有日志可能很有用。但这是针对不同问题的解决方案

关于javascript - JavaScript 会自动跳过空函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56651286/

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