Mi nombre es Davide Faconti y mi trabajo es uno de los mejores del mundo: trabajo en robótica .
Este blog/repositorio se mantiene en mi tiempo libre y no está relacionado con mi trabajo allí. Por lo tanto, las opiniones (y los memes) son mías y no representan a mi empleador de ninguna manera .
Me encanta la programación C ++ y el código abierto y este "diario" es mi pequeña contribución a la comunidad OSS.
Optimizar el código en C ++ es algo que nadie puede resistir. ¡Puede divertirse y fingir que está haciendo algo útil para su organización al mismo tiempo!
En este repositorio, grabaré algunos patrones de diseño simples para mejorar su código y eliminar la sobrecarga innecesaria en C ++ .
Si eres un experto experimentado en C ++, probablemente ya tengas tu propio conjunto de reglas.
Estas reglas te ayudan a parecer un ingeniero malo/rockstar/10x para tus colegas.
Usted es el tipo de persona que deja caer casualmente un std :: vector <> :: reserva antes de un bucle y asiente, sonriendo, mirando la mejora del rendimiento y el asombro de su miembro del equipo.

Con suerte, los ejemplos en este repositorio lo ayudarán a lograr este estado de gurú y, como efecto secundario, salvar el planeta del calentamiento global, evitando que se desperdicie ciclos inútiles de CPU.
Luego, desafortunadamente, alguien al otro lado del planeta comenzará a extraer bitcoins o escribir su solicitud en Python y todo su esfuerzo para salvar la electricidad no fue por nada.
Estoy bromeando, desarrolladores de Python, ¡te amamos!
Narrador: "No estaba bromeando ..."
Lo primero que debe hacer cualquier persona preocupada por el rendimiento es:
Mis colegas y yo casi siempre estamos equivocados por las razones por las que un código es lento.
A veces tenemos razón, pero es realmente difícil saber de antemano cómo la refactorización mejorará el rendimiento. Las buenas herramientas de perfil muestran en minutos las "frutas bajas colgantes": trabajo mínimo, beneficio máximo!
Resumiendo: el perfil de 10 minutos puede ahorrarle horas de adivinación y refactorización.
Mis herramientas "Goto" en Linux son Hotspot y Heaptrack. Entiendo que Windows también tiene herramientas similares.

En la guerra de referencia, si usted es el soldado, estas son sus granadas de rifle y mano.
Una vez que sepa qué parte del código merece ser optimizado, es posible que desee usar Google Benchmark para medir el tiempo dedicado a una clase o función muy específica.
Incluso puede ejecutarlo Google Benchmark en línea aquí: Quick-Bench.com.

Escribir un buen código es como cepillarse los dientes: debe hacerlo sin pensar demasiado en ello.
Es un músculo que necesitas entrenar, que se fortalecerá con el tiempo. Pero no se preocupe: una vez que comience, comenzará a ver patrones recurrentes que son sorprendentemente simples y funcionan en muchos casos de uso diferentes.
Alerta de spoiler : uno de mis trucos más queridos es minimizar la cantidad de asignaciones de montón . No tienes idea de cuánto ayuda.
Pero dejemos algo absolutamente claro:
En otras palabras, piense dos veces antes de hacer cualquier cambio en su código que lo haga menos legible o más difícil de depurar, solo porque cree que puede ser un 2.5% más rápido.
Para una experiencia de lectura más cómoda, visite: https://cpp-optimizations.netlify.app
Use la referencia const de forma predeterminada.
Move Semántica (TODO).
Optimización del valor de retorno (TODO).
Use std :: vector <> :: reservar de forma predeterminada
"He aprendido listas vinculadas en la universidad, ¿debería usarlas?" Nooope.
No necesitas un std::map<> para eso.
Pequeña optimización vectorial
Las cuerdas son (casi) vectores
Cuando no se preocupe: optimización de cadena pequeña.
Concatenación de cadena: el falso sentido de seguridad del operator+ .
std::string_view : amor a primera vista (toDo).
Ejemplo: 2D/3D se transforma de la manera correcta.
Iterando sobre una matriz 2D: menos elegante, más actuante.
boost::container::flat_map . No imaginarás lo que pasó después.Forma más simple y rápida de filtrar las nubes de puntos en PCL.
Palindromo rápido: el costo de las ramas condicionales
Este trabajo tiene licencia bajo CC BY-SA 4.0