cpp::daily - Pare de usar std::endl

Episódio 004: Ganhando um pouco mais de desempenho!


cpp::daily std::endl

Não existe um único procedimento para obter mais desempenho. Desempenho é um pouco de cada um dos detalhes!

Geralmente quando você usa um IDE eles costumam autocompletar seu std::cout com std::endl e isso não é uma boa ideia!

Usar std::endl pode ser ineficiente, pois na verdade ele faz duas tarefas:

  • move o cursor para a próxima linha: '\n';
  • e “esvazia” a saída: std::flush.

Ou seja, ao usar std::endl equivale a usar: '\n' << std::flush.

Ao escrever texto para o console usando std::cout geralmente limpa a saída de qualquer maneira (e se isso não acontecer, geralmente não importa), então ter std::endl flush raramente é importante.

Por causa disso, o uso do caractere '\n' é normalmente preferível. O caractere '\n' move o cursor para a próxima linha, mas não faz a descarga redundante, por isso tem um desempenho melhor. O caractere '\n' também tende a ser mais fácil de ler, pois é mais curto e pode ser incorporado ao texto existente.

O std::endl é tecnicamente desnecessário, uma vez que o programa termina imediatamente depois.

O std::endl pode ser útil somente quando: primeiro, ajuda a indicar que a linha de saída é um “pensamento completo”. Em segundo lugar, se mais tarde quisermos adicionar instruções de saída, não temos que modificar o código existente. Podemos apenas adicioná-los. Mas na maioria “esmagadora” dos casos você não precisará utilizá-lo.

Vamos analisar o tempo de execução do programa abaixo usando o std::endl e depois somente o \n:

Para isso vamos utilizar o comando time para nos informar o tempo de execução

1º Usando std::endl

#include <iostream>
#include <fstream>

void writeln( std::ostream & os, const std::string & str ){
  os << str << std::endl; // USANDO std::endl
}

int main( int argc, char ** argv ){
  std::ofstream outfile( "output.txt", std::ios_base::trunc );
  for (int i = 0; i < 1000000; ++i ) {
   writeln( outfile, "Hello World!" ); 
  }
  return 0;
}

Tempo de execução segundo o comando time:

real	0m3,512s
user	0m0,752s
sys	0m2,749s

2º O mesmo programa utilizando '\n'

#include <iostream>
#include <fstream>

void writeln( std::ostream & os, const std::string & str ){
  os << str << '\n'; // USANDO \n
}

int main( int argc, char ** argv ){
  std::ofstream outfile( "output.txt", std::ios_base::trunc );
  for (int i = 0; i < 1000000; ++i ) {
   writeln( outfile, "Hello World!" ); 
  }
  return 0;
}

Tempo de execução segundo o comando time:

real	0m0,141s
user	0m0,115s
sys	0m0,023s

Ou seja, tivemos um ganho de 3 segundos a cada 1 milhão de ciclos, geralmente quando um programa fica aberto ele faz muito mais ciclos do que isso!


Caso deseje saber mais sobre o comando time use: man time!

DICA DE VÍDEO: Esse vídeo mostra desempenho de linguagens de programação verificadas com o comando time:

Testei o Desempenho de 10 Linguagens de Programação com Ranking


Por hoje é só, são pequenas doses diárias que farão sempre nos manter antenado com o C++ !

Acompanhe o cpp::daily

Deseja aprender C++ e criar seus programas Gráficos e para Terminal com portabilidade para Linux e Windows?

Então se inscreva nos nossos Cursos de C++ Moderno . Você aprender criar:

Acesse o endereço:

https://terminalroot.com.br/cpp/ e saiba mais!



cppdaily


Compartilhe


Nosso canal no Youtube

Inscreva-se


Marcos Oliveira

Marcos Oliveira

Desenvolvedor de software
https://github.com/terroo

Artigos Relacionados




Crie Aplicativos Gráficos para Linux e Windows com C++

Aprenda C++ Moderno e crie Games, Programas CLI, GUI e TUI de forma fácil.

Saiba Mais

Receba as novidades no seu e-mail!

Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!