Confía en tu compilador: los trucos clásicos de optimización en C++ ya no son lo que eran

Fuentes: Trust your compiler

La sabiduría heredada sobre optimización en C++ —el inverso rápido de raíz cuadrada de Quake III, el intercambio por XOR, el conteo de bits de Kernighan, el acceso por punteros de fila— se asentó sobre hardware y compiladores que ya no existen. Este artículo demuestra con benchmarks en un AMD Ryzen 9 9950X, Clang 21.1.1 y -O3 -ffast-math que, en la práctica, las versiones modernas y legibles igualan o superan a los trucos clásicos. El caso del inverso de raíz cuadrada es ilustrativo: el algoritmo de Carmack de 1999 tardaba 380 ns en escalar frente a 373 ns de 1.0f / std::sqrt(x), y en arrays de 65536 elementos la ventaja se diluye (1865 ns frente a 2161 ns). En popcount, std::popcount, el bucle de Kernighan y la versión SWAR generan los 94,5 ns, porque Clang detecta el patrón y emite popcnt en los tres casos. Las instrucciones rsqrtss, vrsqrtss y frsqrte en SSE, AVX y AArch64 ofrecen recíprocos de raíz cuadrada aproximados de baja latencia que el compilador aprovecha automáticamente. El mensaje es claro: usar std::bit_cast, <bit> y operaciones obvias produce código igual de rápido, más portable y con la intención explícita, dejando al compilador y a la CPU el trabajo pesado. El texto incluye código, ensamblado y tablas comparativas, y va acompañado del repositorio de benchmarks con Google Benchmark.