console.log会降低JavaScript的执行性能吗?

时间:2012-07-11 05:37:03

标签: javascript performance

使用调试功能console.log会降低JavaScript执行性能吗?它会影响生产环境中脚本执行的速度吗?

是否有一种方法可以从单个配置位置禁用生产环境中的控制台日志?

9 个答案:

答案 0 :(得分:61)

实际上,console.log比空函数慢得多。在我的Chrome 38上运行this jsPerf test可获得惊人的效果:

  • 当浏览器控制台关闭时,调用console.log 比调用空函数>
  • 当控制台打开时,调用它的速度要慢10万倍

如果您有一次合理数量的console.…次呼叫,那么您不会注意到性能滞后(在我安装Chrome时需要2毫秒 - 或者在控制台打开时需要20毫秒)。但是,如果您反复将内容记录到控制台 - 例如,通过requestAnimationFrame将其挂起 - 它可能会使事情变得棘手。

更新

In this test我还检查了生产的自定义“隐藏日志”的想法 - 有一个保存日志消息的变量,可按需提供。结果是

  • 比原始console.log
  • 快1 000次
  • 如果用户打开控制台,显然会快10 000倍。

答案 1 :(得分:49)

如果您要在公共站点或其他地方使用此功能,任何对使用开发人员工具知之甚少的人都可以阅读您的调试消息。根据您记录的内容,这可能不是理想的行为。

最好的方法之一是将console.log包装在您的一个方法中,并在那里检查条件并执行它。在生产版本中,您可以避免使用这些功能。 Stack Overflow question详细讨论了如何使用Closure compiler进行相同操作。

所以,回答你的问题:

  1. 是的,它会降低速度,虽然只是可以忽略不计。
  2. 但是,不要使用它,因为一个人读取你的日志太容易了。
  3. this question的答案可能会为您提供有关如何将其从生产中移除的提示。

答案 2 :(得分:9)

如果您在通用核心脚本中创建控制台的快捷方式,例如:

var con = console;

然后在整个代码中使用con.log(“message”)或con.error(“错误消息”),在生产中你可以简单地将核心位置的con重新连接到:

var con = {
    log: function() {},
    error: function() {},
    debug: function() {}
}

答案 3 :(得分:7)

const DEBUG = true / false
DEBUG && console.log('string')

答案 4 :(得分:5)

任何函数调用都会轻微降低性能。但是一些console.log不应该有任何显着的效果。

但是,它会在不支持console

的旧浏览器中抛出未定义的错误

答案 5 :(得分:3)

性能影响很小,但在较旧的浏览器中,如果用户浏览器控制台未打开log is not a function of undefined,则会导致JavaScript错误。这意味着在console.log调用之后的所有JavaScript代码都不会执行。

您可以创建一个包装器来检查window.console是否是有效对象,然后在包装器中调用console.log。像这样简单的东西可行:

window.log = (function(console) {
    var canLog = !!console;
    return function(txt) {
        if(canLog) console.log('log: ' + txt);
    };
})(window.console);

log('my message'); //log: my message

这是一个小提琴:http://jsfiddle.net/enDDV/

答案 6 :(得分:2)

我做了这个jsPerf测试:http://jsperf.com/console-log1337

它似乎不需要比其他函数调用更长的时间。

没有控制台API的浏览器怎么样?如果您需要使用console.log进行调试,您可能会在生产部署中包含一个脚本来覆盖控制台API,就像Paul在答案中所建议的那样。

答案 7 :(得分:1)

  

将使用调试功能console.log减少JavaScript   执行性能?它会影响脚本执行的速度吗   生产环境?

当然,console.log()会降低程序的性能,因为它需要大量的计算时间。

  

是否有一种方法可以在生产中禁用控制台日志   一个配置位置创建一个环境?

将此代码放在脚本的开头,以将标准console.log函数覆盖为空函数。

console.log = function () { };

答案 8 :(得分:1)

我这样做是为了维护控制台方法的原始签名。在一个公共位置,先于其他JS加载:

var DEBUG = false; // or true 

然后遍历整个代码

if (DEBUG) console.log("message", obj, "etc");
if (DEBUG) console.warn("something is not right", obj, "etc");