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

Sud*_*ha 78 javascript performance

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

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

tom*_*kwi 65

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

  • 当浏览器控制台被关闭时,呼叫console.log慢大约10万次比调用空函数,
  • 当控制台打开时,称它是高达100万次慢.

如果您有一次合理的console.…呼叫次数,那么您将注意到性能滞后(在我安装Chrome时需要2 ms才能启动 - 或者在控制台打开时需要20 ms).但是如果你反复将东西记录到控制台 - 例如,将它连接起来requestAnimationFrame- 它会让事情变得很糟糕.

更新:

在这个测试中,我还检查了生产的自定义"隐藏日志"的想法 - 有一个保存日志消息的变量,可按需提供.结果证明是这样的

  • 大约比原生的快1 000倍console.log,
  • 如果用户打开控制台,显然会快10 000倍.

  • 当编译器看到空函数时,它不会执行任何操作,因为它看到要执行的行,因此必须运行该函数。编译器根本不会运行空的、未使用的函数作为优化。 (2认同)
  • `console.log` 本身并不会真正影响性能,除非您将其绑定到滚动/调整大小处理程序。这些被多次调用,如果您的浏览器必须以每秒 30/60 倍的速度向控制台发送文本,那么它可能会变得很难看。然后还有一个 IE 错误,在控制台关闭的情况下根本不允许你有 `console.log` :( (2认同)
  • 4 年后(查看@Ĭsααctϫεβöss 的评论),链接仍然损坏。 (2认同)

Ram*_*esh 51

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

最好的方法之一是将console.log一个方法包装在其中,并在哪里检查条件并执行它.在生产版本中,您可以避免使用这些功能.这个Stack Overflow问题详细讲述了如何使用Closure编译器来做同样的事情.

那么,回答你的问题:

  1. 是的,它会降低速度,但只能忽略不计.
  2. 但是,不要使用它,因为一个人读取日志太容易了.
  3. 这个问题的答案可能会给你提示如何从生产中删除它们.

  • 只是注意 - 使用`console.log`来记录对象会导致内存泄漏,因为浏览器会保留对象结构以允许开发人员扩展日志. (11认同)
  • @BluDragn — 为什么要将您不信任客户的个人客户数据发送给客户?即使没有 console.log,他们也可以在“网络”选项卡中查看。 (4认同)
  • @Gajus [你的编辑正在讨论Meta](http://meta.stackoverflow.com/q/321530/2982225) (3认同)
  • @Quentin 确实可以访问源代码,但是当执行该代码时,真正的风险就来了,因为可能正在处理敏感数据(例如来自后端数据库的个人客户数据)。我的组织(以及许多其他组织)中的最佳实践是永远不要在生产代码中使用 console.log。 (3认同)
  • 只是为了报复:我刚刚发现,即使使用相同的静态文本(没有对象或数组;只是console.log('test')会这样做),也会发送垃圾信息来控制console.log,这也会导致性能下降.这引起了我的注意,因为我在重新渲染期间在数百个React组件上调用的函数中记录"被调用".仅仅存在日志记录代码在频繁更新期间引起了非常明显的断断续续. (3认同)
  • 如果人们可以因为你的 console.debug 条目而破解你的网站,那么他们也可以在没有它的情况下破解它。但是:如果您需要调试生产,并且没有调试可以帮助您,那么,这将需要更长的时间来修复。 (3认同)
  • "一个人阅读你的日志太容易了" - 这是怎么回事?这是JavaScript,他们已经完全访问了源代码! (2认同)

hol*_*gon 14

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

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

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

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

console.log = function () { };
Run Code Online (Sandbox Code Playgroud)

  • 这似乎是在生产环境中禁用控制台日志的最简单的解决方案之一。想知道为什么它没有得到更多的关注!我们可以在一个变量下控制这个空函数的定义,我们可以根据我们正在使用的环境(prod 或 dev)切换为真/假 (3认同)
  • 这是一个非常精彩的答案!谢谢! (3认同)

sq2*_*sq2 10

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

var con = console;
Run Code Online (Sandbox Code Playgroud)

然后在整个代码中使用con.log("message")或con.error("错误消息"),在生产中,您只需将核心位置中的con重新连接到:

var con = {
    log: function() {},
    error: function() {},
    debug: function() {}
}
Run Code Online (Sandbox Code Playgroud)

  • 脏的方式:`console.log = function(){}` (13认同)

Ser*_*uns 9

const DEBUG = true / false
DEBUG && console.log('string')
Run Code Online (Sandbox Code Playgroud)

  • 缺少分号;) (3认同)

Pet*_*tah 6

任何函数调用都会稍微降低性能。但是,一些console.log不应该有任何明显的作用。

但是,它将在不支持的旧版浏览器中引发未定义的错误 console