Páginas

terça-feira, 2 de outubro de 2012

[C++] Difereças entre utilizar o '\n' e std::endl

Hoje me veio dúvida cruel quando comparava dois códigos, um em C++ e outro em C: qual a diferença entre utilizar o '\n' e o std::endl quando utilizo C++?
Apesar de ambos serem aceitos existe uma diferença em termos de performance que deve ser considerada quando usamos não apenas para debug (da maneira força bruta, imprimindo logs na tela), mas como por exemplo, saída para um arquivo.
A principal diferença entre eles é que no caso de se utilizar std::endl, ocorre um std::flush após a quebra de linha, enquanto que quando se usa apenas o '\n' isso não ocorre. O principal impacto é quando os dados impressos são redirecionados para um lugar diferente do console ou terminal, como por exemplo um arquivo.
Imagine o cenário onde seu programa espera que o usuário digite uma palavra, sendo ela redirecionada para um arquivo em disco chamado lista_mercado.txt:

  • Se usado o '\n' para pular linha em cada final de palavra, o sistema operacional poderá empilhar os caracteres em um buffer até que eles sejam transferidos para o arquivo. Essa transição de dados ocorre de uma vez, gravando os dados no disco, esvaziando o buffer. O processo se repete até o final da entrada de dados, sendo prudente executar o std::flush antes de se fechar o arquivo.
  • Se utilizarmos o std::endl, a cada palavra digitada ocorrerá o descarga do buffer no arquivo lista_mercado.txt, ou seja, a cada palavra digitada haverá um acesso a disco.
Como sabemos, escrita e leitura em arquivo podem ser demoradas; optando pela segunda opção pode haver perda de desempenho.

Dicas:

  1. Utilize o std::endl quando realizar operações via console ou terminal, ou seja, para mensagens que não onde näo ocorra acesso a disco.
  2. Caso contrário, certifique-se que ocorra o menor número de transição de informações possível, ou seja, utilize um buffer para armazenar as informações e depois enviá-las de uma única vez para saída de dados.



Nenhum comentário:

Postar um comentário