デバッグ機能を使用すると、console.log
JavaScriptの実行パフォーマンスが低下しますか?本番環境でのスクリプト実行速度に影響しますか?
単一の構成場所から運用環境のコンソールログを無効にする方法はありますか?
console.log
は
デバッグ機能を使用すると、console.log
JavaScriptの実行パフォーマンスが低下しますか?本番環境でのスクリプト実行速度に影響しますか?
単一の構成場所から運用環境のコンソールログを無効にする方法はありますか?
console.log
は
回答:
これを公開サイトなどに配置する場合、開発者ツールの使用についてほとんど知識のない人でもデバッグメッセージを読むことができます。ログに記録する内容によっては、これは望ましい動作ではない場合があります。
最良のアプローチのconsole.log
1つは、をメソッドの1つにラップすることです。ここでは、条件を確認して実行できます。本番ビルドでは、これらの機能の使用を回避できます。このStack Overflowの質問では、Closureコンパイラを使用して同じことを行う方法について詳しく説明しています。
だから、あなたの質問に答えるには:
conosle.log
も、オーバーライドされた関数にヒットしますよね?
console.log
オブジェクトをログに記録すると、ブラウザがオブジェクト構造を保持して開発者がログを拡張できるため、メモリリークが発生します。
実際にconsole.log
は、空の関数よりもはるかに遅いです。実行このjsPerfテスト私のクローム38には、見事な結果を与えます:
console.log
は空の関数を呼び出すよりも約10 000倍遅くなります。妥当な数のconsole.…
呼び出しが1回発生するとパフォーマンスの遅れに気付くことはありません(Chromeのインストールで100は2ミリ秒かかります。コンソールが開いている場合は20ミリ秒かかります)。しかし、コンソールに繰り返しログを記録する場合(たとえば、接続する場合)は、requestAnimationFrame
動作が不安定になる可能性があります。
このテストでは、本番用のカスタム「隠しログ」のアイデアも確認しました。オンデマンドで利用できるログメッセージを保持する変数があります。であることが判明
console.log
、console.log
。どちらも副作用を引き起こす関数です。
console.log
それ自体は、スクロール/サイズ変更ハンドラーにバインドしない限り、気づくような方法でパフォーマンスに実際に影響を与えることはありません。これらはたくさん呼び出され、ブラウザが1秒あたり30 / 60xのようにコンソールにテキストを送信しなければならない場合、醜くなります。そしてconsole.log
、コンソールを閉じた状態で ' をまったく使用できなかったIEのバグがあります:(
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)
共通のコアスクリプトでコンソールへのショートカットを作成すると、たとえば、次のようになります。
var con = console;
次に、コード全体でcon.log( "message")またはcon.error( "error message")を使用します。本番環境では、コアロケーションのconを次のように再配線するだけです。
var con = {
log: function() {},
error: function() {},
debug: function() {}
}
console.log = function(){}
デバッグ機能console.logを使用すると、JavaScript実行パフォーマンスが低下しますか?本番環境でのスクリプト実行速度に影響しますか?
もちろん、console.log()
計算時間がかかるため、プログラムのパフォーマンスが低下します。
単一の構成場所から運用環境のコンソールログを無効にする方法はありますか?
このコードをスクリプトの先頭に配置して、標準のconsole.log関数を空の関数にオーバーライドします。
console.log = function () { };
パフォーマンスへの影響は最小限ですが、古いブラウザーでは、ユーザーのブラウザーコンソールが開いていない場合に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/
私はこのjsPerfテストを行いました:http ://jsperf.com/console-log1337
他の関数呼び出しよりも長くかかるようには見えません。
コンソールAPIがないブラウザーについてはどうですか?デバッグにconsole.logを使用する必要がある場合は、ポールが彼の答えで提案しているように、コンソールAPIをオーバーライドするスクリプトを実稼働配備に含めることができます。