El artículo explora dos módulos de OTP ( Erlang/OTP y Elixir) diseñados para realizar conteos rápidos bypassing el modelo tradicional de procesos: :atomics y :counters. La mayoría de los lenguajes de programación comenzó con estructuras de datos mutables y rápidas y posteriormente añadieron características de concurrencia. Erlang siguió el camino opuesto: empezó con primitivas de concurrencia, datos inmutables y memoria por proceso, para luego introducir "escape hatches" que permiten a los procesos modificar áreas compartidas de memoria de forma segura. :atomics es un array de enteros de 64 bits que vive fuera del heap de cualquier proceso (off-heap), es compartido globalmente y es mutable. Permite operaciones atómicas como add_get (añadir y obtener el valor actualizado en una sola operación), exchange (intercambiar valores) y compare_and_swap (comparar y cambiar, fundamental para sincronización). Estas operaciones se mapean directamente a instrucciones CPU, ofreciendo un rendimiento extremadamente rápido. Una característica clave es que garantiza ordenamiento secuencialmente consistente: si un proceso escribe en el índice 1 y luego en el índice 2, cualquier lector que vea el valor del índice 2 también verá necesariamente el valor del índice 1. :counters funciona de manera similar, pero con una arquitectura diferente: utiliza un integer por cada scheduler del sistema. Esto hace que las escrituras sean extremadamente rápidas porque no hay contención entre cores, aunque las lecturas deben sumar los valores de cada scheduler y solo ofrecen consistencia eventual. Los benchmarks del autor mostram que con alta concurrencia, :counters supera significativamente a ETS y :atomics, ya que los escritores no compiten por recursos compartidos. Estas herramientas son ideales para implementar contadores de alto rendimiento, métricas en tiempo real, o cualquier caso de uso que requiera incrementación atómica eficiente.
Erlang acelera conteos con los módulos :atomics y :counters
