Optimizar una estructura de ping en C: de 12 KiB a 4 KiB por diversión

Fuentes: Premature Optimization is Fun Sometimes
Imagen generada por IA con el prompt: Abstract technical illustration of a glowing memory page with binary digits and compact C struct diagrams floating in a dark blue circuit-board background, editorial style.
Imagen generada con IA

Un programador describe cómo, mientras trabajaba con un colega en un sistema de monitorización de conectividad basado en pings ICMP, fue reduciendo progresivamente el tamaño de la estructura de datos que almacena las entradas del anillo (ring buffer) de 512 elementos. Partiendo de un struct inicial con marcas de tiempo en nanosegundos para envío y recepción, la dirección de origen, el número de secuencia y un booleano, el diseño alcanza 12 KiB para todo el buffer.

La optimización se apoya en varias ideas combinadas. Primero, se reemplaza el par de timestamps por una unión etiquetada: mientras el paquete no se ha recibido se guarda el instante de envío; al recibirse, se sustituye por la latencia calculada. Segundo, se reduce la precisión temporal de nanosegundos a incrementos de 100 microsegundos, suficientes para medir tiempos de ping del orden de decenas o cientos de milisegundos. Tercero, el campo "recibido" se codifica como un bitfield. Por último, se aprovecha el campo identificador de 16 bits de ICMP para distinguir cambios de dirección de origen con un contador de 4 bits, lo que permite eliminar la dirección de origen de la estructura y ajustar la alineación para que seq_no se cargue con una sola instrucción ldrh.

El resultado final son 4 KiB, ocho kilobytes menos que el diseño original, repartidos en una sola página de memoria. El artículo también muestra cómo reorganizar los campos y voltear la semántica del bit de recibido permite al compilador eliminar una operación de máscara. El autor reconoce que el ejercicio fue completamente innecesario, ya que la aplicación no tiene restricciones de memoria, pero resultaba entretenido.