O console.log reduzirá o desempenho de execução do JavaScript?

99

O uso do recurso de depuração console.logreduzirá o desempenho de execução do JavaScript? Isso afetará a velocidade de execução do script em ambientes de produção?

Existe uma abordagem para desabilitar logs de console em ambientes de produção a partir de um único local de configuração?

Sudantha
fonte
Todas as respostas, até agora, presumem que você está simplesmente emitindo mensagens de string. E sobre o desempenho de objetos de registro, com estruturas de objetos possivelmente grandes? por exemplo, console.log (largeObj)?
PandaWood
A saída de um número significativo de objetos para o console pode transformar o carregamento de página de 3 segundos em 30 segundos. Apenas um exemplo ...
Andrew
Um simples console.logleva aproximadamente 50ms
Pedram marandi

Respostas:

55

Se você tiver isso em um site público ou algo assim, qualquer pessoa com pouco conhecimento sobre como usar as ferramentas de desenvolvedor pode ler suas mensagens de depuração. Dependendo do que você está registrando, esse pode não ser um comportamento desejável.

Uma das melhores abordagens é envolver o console.logem um de seus métodos e onde você pode verificar as condições e executá-lo. Em uma construção de produção, você pode evitar ter essas funções. Esta questão do Stack Overflow fala em detalhes sobre como fazer o mesmo usando o compilador Closure .

Então, para responder às suas perguntas:

  1. Sim, reduzirá a velocidade, embora de forma insignificante.
  2. Mas não o use, pois é muito fácil para uma pessoa ler seus registros.
  3. As respostas a esta pergunta podem dar dicas sobre como removê-los da produção.
Ramesh
fonte
obrigado, mas ainda envolvendo o conosle.logainda fará um hit na função substituída, não é?
Sudantha
15
Apenas uma observação - usar console.logpara registrar objetos causa vazamento de memória, pois o navegador retém a estrutura do objeto para permitir que os desenvolvedores expandam o registro.
Shamasis Bhattacharya
3
@Gajus Sua edição está sendo discutida no Meta
Infinite Recursion
8
"é muito fácil para uma pessoa ler seus registros" - Como isso é um problema? É JavaScript, eles já têm acesso total ao código-fonte!
Quentin
4
Só para entrar na conversa: acabei de descobrir que enviar spam para o console.log mesmo com o mesmo texto estático (nenhum objeto ou array; literalmente, apenas console.log ('test') faria isso) também causa um impacto no desempenho. Isso chamou minha atenção quando eu estava registrando "chamado" em uma função que foi chamada em centenas de componentes do React durante as novas renderizações. A mera presença do código de registro causou travamento muito perceptível durante atualizações frequentes.
Lev
80

Na verdade, console.logé muito mais lento do que uma função vazia. Executar este teste jsPerf no meu Chrome 38 oferece resultados impressionantes:

  • quando o console do navegador é fechado, chamar console.logé cerca de 10.000 vezes mais lento do que chamar uma função vazia,
  • e quando o console está aberto, a chamada é até 100.000 vezes mais lenta .

Não que você notará o atraso de desempenho se tiver um número razoável de console.…chamadas disparando uma vez (cem levará 2 ms na minha instalação do Chrome - ou 20 ms quando o console estiver aberto). Mas se você logar coisas no console repetidamente - por exemplo, conectando-o requestAnimationFrame- pode tornar as coisas bagunçadas.

Atualizar:

Neste teste também verifiquei a ideia de um “log oculto” personalizado para produção - tendo uma variável que contém mensagens de log, disponíveis sob demanda. Acontece que é

  • cerca de 1 000 vezes mais rápido que o nativo console.log,
  • e obviamente 10 000 vezes mais rápido se o usuário estiver com o console aberto.
tomekwi
fonte
1
Quando um compilador vê uma função vazia, ele não executa nada embora, visto que uma linha para executar, terá que executar a função. o compilador simplesmente não executa uma função vazia e não utilizada como uma otimização.
SidOfc
1
@SidneyLiebrand obrigado pela informação, é bom saber. Os resultados do segundo teste podem ser otimizados da mesma maneira console.log. Ambos são funções que produzem efeitos colaterais.
tomekwi
1
console.logpor si só não afeta o desempenho de uma maneira que você notará, a menos que você o vincule a um manipulador de rolagem / redimensionamento. Eles são chamados de muitos e se seu navegador tem que enviar texto para o console como 30 / 60x por segundo, pode ficar feio. E há aquele bug do IE que não permitia que você o tivesse console.logcom o console fechado :(
SidOfc
1
Você está absolutamente certo - eu escrevi isso na minha resposta também. Como regra geral, tento não ter chamadas de console no código de produção. Mas o desempenho não é o motivo - é porque “é muito fácil para um leigo ler seus logs”, como escreveu @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
12
const DEBUG = true / false
DEBUG && console.log('string')
Sergey Guns
fonte
que solução elegante!
Systems Rebooter
10

Se você criar um atalho para o console em um script central comum, por exemplo:

var con = console;

e, em seguida, use con.log ("mensagem") ou con.error ("mensagem de erro") em todo o código. Na produção, você pode simplesmente reconectar con no local central para:

var con = {
    log: function() {},
    error: function() {},
    debug: function() {}
}
sq2
fonte
16
da maneira suja:console.log = function(){}
br4nnigan,
8

O uso do recurso de depuração console.log reduzirá o desempenho de execução do JavaScript? Isso afetará a velocidade de execução do script em ambientes de produção?

Claro, console.log()irá reduzir o desempenho do seu programa, pois leva tempo computacional.

Existe uma abordagem para desabilitar logs de console em ambientes de produção a partir de um único local de configuração?

Coloque este código no início do seu script para substituir a função console.log padrão por uma função vazia.

console.log = function () { };
Holydragon
fonte
2
Esta parece ser uma das soluções mais simples para desativar os logs do console no ambiente de produção. Querendo saber por que não tem mais atenção! Podemos controlar a definição desta função vazia sob uma variável que podemos alternar como verdadeiro / falso, dependendo do ambiente em que estamos trabalhando (prod ou dev)
Anshuman Manral
2
Esta é uma resposta brilhante! Obrigado!
Systems Rebooter
6

Qualquer chamada de função reduzirá ligeiramente o desempenho. Mas alguns console.lognão devem ter nenhum efeito perceptível.

No entanto, ele lançará erros indefinidos em navegadores mais antigos que não suportam console

Petah
fonte
3

O impacto no desempenho será mínimo; no entanto, em navegadores mais antigos, ele causará erros de JavaScript se o console do navegador do usuário não estiver aberto log is not a function of undefined. Isso significa que todo o código JavaScript após a chamada console.log não será executado.

Você pode criar um wrapper para verificar se window.consoleé um objeto válido e, em seguida, chamar console.log no wrapper. Algo simples como isso funcionaria:

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

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

Aqui está um violino: http://jsfiddle.net/enDDV/

Paulo
fonte
2

Fiz este teste jsPerf: http://jsperf.com/console-log1337

Parece não demorar mais do que outras chamadas de função.

E os navegadores que não possuem uma API de console? Se você precisar usar console.log para depuração, pode incluir um script em sua implantação de produção para substituir a API do console, como Paul sugere em sua resposta.

Jørgen
fonte
se eu puder selecionar duas respostas, isso irá para o topo
Sudantha
1
Seu teste não apenas adiciona uma chamada console.log, mas também executa a mesma operação jquery duas vezes. Criei a seguinte revisão do seu teste, espero que ajude: jsperf.com/console-log1337/7 PS: obrigado, eu não sabia sobre jsperf.com :)
dubrox
2
Na verdade, parece ser muito mais lento do que uma chamada de função normal. Em um duelo direto, os resultados são incomparáveis: jsperf.com/console-log1337/14
tomekwi
1
Resposta ruim. Nem mesmo remotamente correto. O pensamento positivo vota como @tomekwi demonstra que a diferença é notável. Eu mesmo fiz vários testes no mundo real e posso dizer com certeza, sem sombra de dúvida, que enviar spam para console.log definitivamente causa um impacto no desempenho. Alguns registros aqui e ali a cada segundo ou dois, não é grande coisa, mas registra algo freqüentemente (em atualizações de quadros, re-renderizações de componentes massivos) e a diferença com e sem console.log é noite e dia.
Lev
0

Eu faço isso dessa maneira para manter a assinatura original dos métodos do console. Em um local comum, carregado antes de qualquer outro JS:

var DEBUG = false; // or true 

Em seguida, em todo o código

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