Meu nome é Davide Faconti e meu trabalho é um dos melhores do mundo: trabalho em robótica .
Este blog/repositório é mantido no meu tempo livre e não está relacionado ao meu trabalho lá. Portanto, as opiniões (e memes) são todos meus e não representam meu empregador de forma alguma .
Eu amo a programação C ++ e o código aberto e esse "diário" é minha pequena contribuição para a comunidade OSS.
Otimizar o código em C ++ é algo que ninguém pode resistir. Você pode se divertir e fingir que está fazendo algo útil para sua organização ao mesmo tempo!
Neste repositório, registrarei alguns padrões de design simples para melhorar seu código e remover uma sobrecarga desnecessária no C ++ .
Se você é um especialista em C ++ experiente, provavelmente já possui seu próprio conjunto de regras.
Essas regras ajudam você a parecer um engenheiro ruim/rockstar/10x para seus colegas.
Você é o tipo de pessoa que derruba casualmente um STD :: Vector <> :: Reserve antes de um loop e assente, sorrindo, olhando para a melhoria do desempenho e o espanto do membro da sua equipe.

Felizmente, os exemplos deste repositório ajudarão você a alcançar esse status de guru e, como efeito colateral, salvar o planeta do aquecimento global, poupando os ciclos inúteis da CPU por serem desperdiçados.
Infelizmente, alguém do outro lado do planeta começará a minerar bitcoins ou escreverá seu aplicativo em Python e todo o seu esforço para economizar eletricidade não era por nada.
Estou brincando, desenvolvedores de Python, nós te amamos!
Narrador: "Ele não estava brincando ..."
A primeira coisa que qualquer pessoa preocupada com o desempenho deve fazer é:
Eu e meus colegas quase sempre estamos errados sobre as razões pelas quais um código é lento.
Às vezes, estamos certos, mas é realmente difícil saber com antecedência como a refatoração melhorará o desempenho. Boas ferramentas de perfil mostram em minutos as "frutas baixas": trabalho mínimo, benefício máximo!
Resumindo: o perfil de 10 minutos pode economizar horas de adivinhação e refatoração.
Minhas ferramentas "Goto" no Linux são pontos de acesso e heaptrack. Eu entendo que o Windows também tem ferramentas semelhantes.

Na guerra de referência, se você é o soldado, essas são as suas granadas de rifle e mão.
Depois que você souber qual parte do código merece ser otimizada, convém usar o benchmark do Google para medir o tempo gasto em uma classe ou função muito específica.
Você pode até executá-lo no Google Benchmark Online aqui: Quick-banch.com.

Escrever um bom código é como escovar os dentes: você deve fazê -lo sem pensar muito sobre isso.
É um músculo que você precisa treinar, que ficará mais forte com o tempo. Mas não se preocupe: depois de começar, você começará a ver padrões recorrentes que são surpreendentemente simples e funcionam em muitos casos de uso diferentes.
Alerta de spoiler : Um dos meus truques mais amados é minimizar o número de alocações de heap . Você não tem ideia de quanto isso ajuda.
Mas vamos deixar algo absolutamente claro:
Em outras palavras, pense duas vezes antes de fazer qualquer alteração no seu código que o torne menos legível ou mais difícil de depurar, apenas porque você acredita que ele pode funcionar 2,5% mais rápido.
Para uma experiência de leitura mais confortável, visite: https://cpp-optimizações.netlify.app
Use a referência const por padrão.
Mover semântico (TODO).
Otimização de valor de retorno (TODO).
Use STD :: Vector <> :: Reserve por padrão
"Aprendi listas vinculadas na universidade, devo usá-las?" Nooope.
Você não precisa de um std::map<> para isso.
Otimização de pequenos vetores
Strings são (quase) vetores
Quando não se preocupar: otimização de pequenas cordas.
Concatenação da string: o falso senso de segurança do operator+ .
std::string_view : amor à primeira vista (TODO).
Exemplo: 2D/3D transforma da maneira certa.
Iterando sobre uma matriz 2D: menos elegante e com mais desempenho.
boost::container::flat_map . Você não vai imaginar o que aconteceu a seguir.Maneira mais simples e rápida de filtrar as nuvens de ponto no PCL.
Palíndromo rápido: o custo dos ramos condicionais
Este trabalho é licenciado sob o CC BY-SA 4.0