console.log가 JavaScript 실행 성능을 저하 시키나요?


99

디버깅 기능을 사용 console.log하면 JavaScript 실행 성능이 저하됩니까? 프로덕션 환경에서 스크립트 실행 속도에 영향을 줍니까?

단일 구성 위치에서 프로덕션 환경에서 콘솔 로그를 비활성화하는 방법이 있습니까?


지금까지 모든 답변은 단순히 문자열 메시지를 출력한다고 가정합니다. 개체 구조가 클 수있는 로깅 개체의 성능은 어떻습니까? 예 : console.log (largeObj)?
PandaWood

많은 수의 개체를 콘솔에 출력하면 3 초의 페이지로드가 30 초로 바뀔 수 있습니다. 그냥 예를 들어 ...
앤드류

간단한은 console.log~ 50ms가 소요
페드 람 marandi에게

답변:


55

공개 사이트 등에서이 기능을 사용하려는 경우 개발자 도구 사용에 대한 지식이 거의없는 사람은 디버그 메시지를 읽을 수 있습니다. 로깅중인 항목에 따라 이것은 바람직한 동작이 아닐 수 있습니다.

가장 좋은 방법 console.log중 하나는 메서드 중 하나에을 래핑하고 조건을 확인하고 실행할 수있는 위치입니다. 프로덕션 빌드에서는 이러한 기능을 피할 수 있습니다. 이 Stack Overflow 질문Closure 컴파일러를 사용하여 동일한 작업을 수행하는 방법에 대해 자세히 설명합니다 .

따라서 귀하의 질문에 답하려면 :

  1. 예, 무시할 수 있지만 속도가 감소합니다 .
  2. 그러나 사람이 로그를 읽기가 너무 쉽기 때문에 사용하지 마십시오.
  3. 에 대한 답변 이 질문은 당신이 생산에서 제거하는 방법에 대한 힌트를 제공 할 수 있습니다.

고맙지 만 여전히 conosle.log의지를 감싸는 것은 여전히 재정의 된 기능에 타격을 입히지 않습니까?
Sudantha

15
참고로 console.log객체를 기록 하는 데 사용 하면 브라우저가 객체 구조를 유지하여 개발자가 로그를 확장 할 수 있으므로 메모리 누수가 발생합니다.
Shamasis Bhattacharya 2014


8
"사람이 로그를 읽기가 너무 쉽습니다."— 이것이 어떻게 문제입니까? 자바 스크립트이고 이미 소스 코드에 대한 전체 액세스 권한이 있습니다!
Quentin 2016

4
그냥 차임 : 방금 발견했습니다. 동일한 정적 텍스트 (개체 나 배열 없음, 문자 그대로 console.log ( 'test') 만 수행)로도 console.log를 스팸하는 것도 성능 저하를 유발합니다. 다시 렌더링하는 동안 수백 개의 React 구성 요소에서 호출 된 함수 내에서 "호출"을 로깅 할 때이 점이 주목을 받았습니다. 로깅 코드의 존재만으로 빈번한 업데이트 중에 매우 눈에 띄는 끊김 현상이 발생했습니다.
Lev

80

실제로 console.log는 빈 함수보다 훨씬 느립니다. 이 jsPerf 테스트 를 Chrome 38에서 실행 하면 놀라운 결과를 얻을 수 있습니다.

  • 브라우저 콘솔이 닫히면 빈 함수를 호출하는 것보다 호출 console.log약 10,000 배 느립니다 .
  • 콘솔이 열려있을 때, 그것을 호출하면 100만큼 000 배 느립니다 .

합리적인 수의 console.…호출이 한 번 발생하면 성능 지연을 알 수 없습니다 (Chrome 설치시 100 번은 2ms, 콘솔이 열려 있으면 20ms). 하지만 콘솔에 반복적으로 기록하는 경우 (예 : 연결하는 requestAnimationFrame경우) 문제가 발생할 수 있습니다.

최신 정보:

이 테스트에서는 필요에 따라 사용할 수있는 로그 메시지를 보유하는 변수가있는 프로덕션을위한 사용자 지정 "숨겨진 로그"아이디어도 확인했습니다. 그것은 것으로 밝혀졌습니다

  • 네이티브보다 약 1,000 배 빠릅니다 console.log.
  • 사용자가 콘솔을 열면 분명히 10,000 배 더 빠릅니다.

1
컴파일러가 빈 함수를 볼 때, 함수를 실행해야 할 줄이 보이면 아무것도 실행하지 않습니다. 컴파일러는 최적화로 사용되지 않는 빈 함수를 실행하지 않습니다.
SidOfc 2015

1
@SidneyLiebrand 정보 주셔서 감사합니다. 두 번째 테스트의 결과는 동일한 방식으로 최적화 할 수 있습니다 console.log. 둘 다 부작용을 일으키는 기능입니다.
tomekwi apr

1
console.log스크롤 / 크기 조정 핸들러에 바인딩하지 않는 한 눈에 띄는 방식으로 성능에 영향을주지 않습니다. 이것들은 많이 호출되고 브라우저가 초당 30 / 60x와 같이 콘솔에 텍스트를 보내야한다면 추악해질 수 있습니다. 그리고 console.log콘솔이 닫힌 상태에서 's'를 전혀 가질 수 없었던 IE 버그가 있습니다 :(
SidOfc

1
당신이 절대적으로 옳습니다 – 저도 제 대답에 썼습니다. 경험상 프로덕션 코드에 콘솔 호출이 없도록 노력합니다. 그러나 성능이 그 이유가 아닙니다. @Ramesh가 쓴 것처럼 "비전문가가 로그를 읽기에는 너무 쉽기 때문입니다."
tomekwi

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)
casey


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
이것은 프로덕션 환경에서 콘솔 로그를 비활성화하는 가장 간단한 솔루션 중 하나 인 것 같습니다. 왜 더 많은 관심이 없는지 궁금합니다! 우리는 우리가 참 / 거짓이되는 환경에 우리가 (자극 또는 DEV)에서 작업 의존으로 전환 할 수있는 변수에서이 빈 함수의 정의를 제어 할 수 있습니다
Anshuman Manral

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를 사용해야하는 경우 Paul이 답변에서 제안한 것처럼 콘솔 API를 재정의하는 스크립트를 프로덕션 배포에 포함 할 수 있습니다.


나는이 대답을 선택할 수있는 경우이 맨 위로 이동합니다
Sudantha

1
테스트는 console.log 호출을 추가 할뿐만 아니라 동일한 jquery 작업을 두 번 실행합니다. 다음 버전의 테스트를 만들었습니다. 도움이되기를 바랍니다. jsperf.com/console-log1337/7 추신 : 감사합니다 . jsperf.com 에 대해 몰랐습니다. :)
dubrox

2
실제로 일반 함수 호출보다 훨씬 느린 것 같습니다. 직접 결투에서 결과는 비교할 수 없습니다 : jsperf.com/console-log1337/14
tomekwi

1
잘못된 대답입니다. 원격으로도 수정하지 않습니다. @tomekwi가 그 차이를 보여 주듯이 희망찬 생각의 업 투표는 ​​놀랍습니다. 필자는 여러 실제 테스트를 직접 수행했으며 의심 할 여지없이 console.log 스팸이 성능 저하를 유발한다고 말할 수 있습니다. 매초 또는 이틀마다 몇 개의 로그가 여기저기서 큰 문제는 아니지만 자주 로그 (프레임 업데이트, 대규모 구성 요소의 다시 렌더링)하고 console.log를 사용하거나 사용하지 않는 차이는 밤낮입니다.
Lev

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.