console.logはJavaScriptの実行パフォーマンスを低下させますか?


99

デバッグ機能を使用すると、console.logJavaScriptの実行パフォーマンスが低下しますか?本番環境でのスクリプト実行速度に影響しますか?

単一の構成場所から運用環境のコンソールログを無効にする方法はありますか?


これまでのすべての回答は、単に文字列メッセージを出力していると想定しています。オブジェクト構造が大きくなる可能性のあるロギングオブジェクトのパフォーマンスはどうですか?例:console.log(largeObj)?
PandaWood 2016年

大量のオブジェクトをコンソールに出力すると、3秒のページの読み込みが30秒に変わる可能性があります。単なる例...
Andrew

単純な処理にconsole.log
最大

回答:


55

これを公開サイトなどに配置する場合、開発者ツールの使用についてほとんど知識のない人でもデバッグメッセージを読むことができます。ログに記録する内容によっては、これは望ましい動作ではない場合があります。

最良のアプローチのconsole.log1つは、をメソッドの1つにラップすることです。ここでは、条件を確認して実行できます。本番ビルドでは、これらの機能の使用を回避できます。このStack Overflowの質問では、Closureコンパイラを使用して同じことを行う方法について詳しく説明しています。

だから、あなたの質問に答えるには:

  1. はい、無視できますが速度が低下します。
  2. ただし、ユーザーがログを読み取るのは簡単すぎるため、使用しないでください。
  3. 回答この質問はあなたが生産からそれらを削除する方法についてのヒントを与えることができます。

感謝しますが、ラップしてconosle.logも、オーバーライドされた関数にヒットしますよね?
スダンタ

15
注意点- console.logオブジェクトをログに記録すると、ブラウザがオブジェクト構造を保持して開発者がログを拡張できるため、メモリリークが発生します。
Shamasis Bhattacharya 2014


8
「人があなたのログを読むのは簡単すぎる」—これはどのように問題ですか?それはJavaScriptであり、彼らはすでにソースコードへの完全なアクセス権を持っています!
クエンティン

4
ただ気づくだけです:同じ静的テキスト(オブジェクトや配列はありません。文字通りconsole.log( 'test')が実行します)でも、console.logにスパムを送信すると、パフォーマンスが低下します。これは、再レンダリング中に何百ものReactコンポーネントで呼び出された関数内で「呼び出された」ログを記録していたときに、私の注意を引きました。ロギングコードが存在するだけで、頻繁な更新の際に非常にはっきりとしたスタッターが発生しました。
レフ

80

実際にconsole.logは、空の関数よりもはるかに遅いです。実行このjsPerfテスト私のクローム38には、見事な結果を与えます:

  • ブラウザコンソールが閉じている場合、呼び出しconsole.logは空の関数を呼び出すより約10 000倍遅くなります。
  • また、コンソールが開いているときの呼び出しは、100 000倍も遅くなります

妥当な数のconsole.…呼び出しが1回発生するとパフォーマンスの遅れに気付くことはありません(Chromeのインストールで100は2ミリ秒かかります。コンソールが開いている場合は20ミリ秒かかります)。しかし、コンソールに繰り返しログを記録する場合(たとえば、接続する場合)は、requestAnimationFrame動作が不安定になる可能性があります。

更新:

このテストでは、本番用のカスタム「隠しログ」のアイデアも確認しました。オンデマンドで利用できるログメッセージを保持する変数があります。であることが判明

  • ネイティブより約1000倍速いconsole.log
  • ユーザーがコンソールを開いていると、明らかに10 000倍速くなります。

1
コンパイラは、空の関数を検出すると、関数を実行する必要があるため、実行する行を検出するため、何も実行しません。コンパイラーは単に、最適化として空の未使用の関数を実行しません。
SidOfc 2015

1
@SidneyLiebrand情報をありがとう、知っておくと良い。2番目のテストの結果は、同じ方法で最適化できますconsole.log。どちらも副作用を引き起こす関数です。
tomekwi 2015

1
console.logそれ自体は、スクロール/サイズ変更ハンドラーにバインドしない限り、気づくような方法でパフォーマンスに実際に影響を与えることはありません。これらはたくさん呼び出され、ブラウザが1秒あたり30 / 60xのようにコンソールにテキストを送信しなければならない場合、醜くなります。そしてconsole.log、コンソールを閉じた状態で ' をまったく使用できなかったIEのバグがあります:(
SidOfc

1
あなたは完全に正しいです-私も私の答えでそれを書きました。経験則として、量産コードではコンソール呼び出しを行わないようにします。しかし、パフォーマンスは理由ではありません。それは、@ Rameshが書いたように、「素人がログを読むのは簡単すぎる」ためです。
tomekwi 2015

1
logging-on x 3,179 ops/sec ±2.07% (56 runs sampled) logging-off x 56,058,330 ops/sec ±2.87% (56 runs sampled) logging-off-stringify x 1,812,379 ops/sec ±3.50% (58 runs sampled) log-nothing x 59,509,998 ops/sec ±2.63% (59 runs sampled)
ケーシー


10

共通のコアスクリプトでコンソールへのショートカットを作成すると、たとえば、次のようになります。

var con = console;

次に、コード全体でcon.log( "message")またはcon.error( "error message")を使用します。本番環境では、コアロケーションのconを次のように再配線するだけです。

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

16
汚い方法:console.log = function(){}
br4nnigan

8

デバッグ機能console.logを使用すると、JavaScript実行パフォーマンスが低下しますか?本番環境でのスクリプト実行速度に影響しますか?

もちろん、console.log()計算時間がかかるため、プログラムのパフォーマンスが低下します。

単一の構成場所から運用環境のコンソールログを無効にする方法はありますか?

このコードをスクリプトの先頭に配置して、標準のconsole.log関数を空の関数にオーバーライドします。

console.log = function () { };

2
これは、本番環境でコンソールログを無効にする最も簡単なソリューションの1つであるようです。なぜこれ以上注目されないのかと思います!作業している環境(製品または
開発

2
これは素晴らしい答えです!ありがとう!
Systems Rebooter

6

関数を呼び出すと、パフォーマンスがわずかに低下します。ただし、いくつconsole.logかのには目立った効果はありません。

ただし、サポートしていない古いブラウザでは未定義のエラーがスローされます console


3

パフォーマンスへの影響は最小限ですが、古いブラウザーでは、ユーザーのブラウザーコンソールが開いていない場合にJavaScriptエラーが発生しますlog is not a function of undefined。つまり、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/


2

私はこのjsPerfテストを行いました:http ://jsperf.com/console-log1337

他の関数呼び出しよりも長くかかるようには見えません。

コンソールAPIがないブラウザーについてはどうですか?デバッグにconsole.logを使用する必要がある場合は、ポールが彼の答えで提案しているように、コンソールAPIをオーバーライドするスクリプトを実稼働配備に含めることができます。


私が2つの回答を選択できる場合、これが上位に表示されます
スダンサ2012

1
テストでは、console.log呼び出しを追加するだけでなく、同じjquery操作を2回実行します。私はあなたのテストの次のリビジョンを作成しました、それが役に立てば幸いです:jsperf.com/console-log1337/7 PS:ありがとう、jsperf.comについて知りませんでした:)
dubrox

2
実際には、通常の関数呼び出しよりもはるかに遅いようです。直接決闘での結果は比類のないものです:jsperf.com/console-log1337/14
tomekwi

1
悪い答え。遠くからでも正しくない。@tomekwiがその違いを示しているように、希望的思考は賛成票を投じます。私はいくつかの実際のテストを自分で行ったので、spam console.logのスパムの疑いもなく、絶対にパフォーマンスヒットを引き起こします。あちこちに数個のログがあちこちにあり、大したことはありませんが、頻繁に何かを記録し(フレームの更新、大量のコンポーネントの再レンダリング)、console.logの有無による違いは昼と夜です。
レフ

0

コンソールメソッドの元の署名を維持するために、私はこのようにしています。共通の場所で、他のJSの前に読み込まれます。

var DEBUG = false; // or true 

その後、コード全体

if (DEBUG) console.log("message", obj, "etc");
if (DEBUG) console.warn("something is not right", obj, "etc");
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.