Benchmark en Go: un mapa fragmentado con 256 cerrojos supera al resto

Fuentes: Shard your locks: benchmarking 6 Go cache designs

Este artículo presenta una comparativa exhaustiva de seis diseños de caché en memoria (pares clave-valor de cadenas) implementados exclusivamente con la biblioteca estándar de Go y evaluados con pruebas de rendimiento. Los diseños comparados son: un mapa plano sin protección (no seguro), un mapa con sync.Mutex, otro con sync.RWMutex, el tipo sync.Map de la biblioteca estándar, un mapa fragmentado en 256 segmentos con un cerrojo por segmento y una variante de copia en escritura basada en atomic.Pointer. Todos comparten una misma interfaz, lo que permite medirlos en idénticas condiciones.

Las pruebas se ejecutaron sobre un Intel i7-14700K (20 núcleos) con GOMAXPROCS entre 1 y 8, fijando el proceso a los núcleos P físicos, con un millón de claves y cargas de trabajo de solo lectura, lectura intensiva, equilibradas y escritura intensiva, tanto con distribución uniforme como con distribución sesgada (Zipf s=1,1). Cada punto es la mediana de 10 ejecuciones.

El diseño fragmentado (sharded) resulta ganador en casi todos los escenarios, alcanzando hasta 8 veces el rendimiento de un único mutex con 8 núcleos, con apenas 15 líneas de código. La variante de copia en escritura domina en lecturas puras (87 millones de operaciones por segundo) pero colapsa con cualquier escritura, ya que cada escritura copia el millón de entradas. El sync.RWMutex, contrariamente a la intuición, escala mal: se estanca en torno a 2× y rinde peor que un mutex simple bajo escritura. El trabajo también analiza el impacto de los defer de Go 1.26 (+8 % respecto a un desbloqueo explícito) y la elección de 256 segmentos como punto óptimo entre contención y consumo de memoria.