Já parou para ver se seus logs podem estar consumindo recursos e performance ?
Quando trabalhamos com aplicações de alta performance é importante sabermos que algumas coisas muitas vezes imperceptíveis à primeira vista podem causar problemas de performance e consumo de recursos !
Quando criamos uma aplicação muitas vezes em suas fases iniciais, colocamos muitos logs para monitorar a aplicação e como ela vai se comportar, mas chega um momento que vamos lá e apenas setamos a configuração para que o nível do log padrão seja “Error” para que a aplicação não acumule mais logs inúteis. (Se não sabe do que se trata, verifique nas postagens anteriores neste link ).
Vamos partir de uma três tipos de log que encontramos nas aplicações:
Texto simples
logger.Information("Teste de log");
Texto interpolado
logger.Information($"Teste de log {number}");
Texto concatenado
logger.Information($"Teste de log "+ number);
Vemos isto na maioria das aplicações, porém, mesmo que nossos logs não sejam enviados por nosso nível estar setado em níveis superiores à Information, há um problema, alocamos memória para realizar a montagem da string, que muitas vezes é mais complexa do que esta !
Num teste simples, montei um benchmark para verificar quanto de memória e tempo consumimos para apenas estas implementações:
Um detalhe muito importante: Podemos ver que a interpolação resultou em um tempo maior de processamento !
Aí é que entra a idéia principal, se eu não vou precisar deste log, para que montar a sua string consumindo memória sem necessidade ?
Então para evitar que fosse feita a montagem da string, fiz uma modificação na aplicação, colocando uma instrução que valida o nível de log antes de executá-lo.
if (logger.IsEnabled(Serilog.Events.LogEventLevel.Information))
logger.Information("Teste de log");
Com isto, executei o teste de benchmark e validei os números:
É visível a diferença no tempo de execução e consumo de memória, quando não passamos pelas linhas onde o texto sofre algum tipo de processamento, pois a aplicação aloca espaço em memória levando o parâmetro enviado, para que dentro do método do log seja feita uma verificação !
Portanto, verifique suas aplicações ! Eu encontrei potenciais pontos de melhoria ao validar estes casos, falo por experiência própria, pois dentro de vários processos onde havia threads em paralelo e loops com interações que processariam até 300 linhas de log sem necessidade tivermos um aumento absurdo de performance em aplicações da vida real !
Caso queira ver o teste realizado, o projeto encontra-se no meu github: NIZZOLA/LogBenchmarks: Projeto testando a performance dos logs nas aplciações .net (github.com)
Gostou do artigo? clique no ícone👏e me siga para ver as próximas publicações !! Quer ver mais conteúdos, acesse minhas redes através do Linktree: https://linktree.com/nizzola
Referência:
Quer saber mais sobre Benchmarks no .NET ?