Wednesday, September 17, 2025
De manipular timestamps a comparadores personalizados: una historia de rendimiento
Cuando desarrollas dentro del entorno de WhatsApp y necesitas un orden de chats personalizado, tienes que elegir: manipular los datos de los chats para que encajen en la lógica de ordenamiento existente, o implementar un ordenamiento propio. Este post cuenta cómo migramos de un enfoque costoso que manipulaba timestamps a una solución eficiente con un comparador personalizado.
El problema
Nuestro sistema de gestión de chats necesitaba una lógica de ordenamiento personalizada basada en distintos estados de prioridad, con requisitos de orden específicos que no se podían lograr solo con el ordenamiento estándar por timestamp.

El orden original es cronológico (se sigue usando en la vista 'All')
Primer enfoque: manipular timestamps
Al principio modificamos los timestamps de los chats para aprovechar el ordenamiento existente:
Problemas
Los principales problemas de este enfoque tenían que ver con el rendimiento, la integridad de los datos, el uso de memoria y la complejidad de la restauración. Cada ordenamiento requería generar timestamps en O(n), lo que hacía el proceso mucho más lento. Además, los timestamps originales se sobrescribían, lo que comprometía la integridad de los datos. Para mitigarlo, había que guardar en caché los valores originales, lo que sumaba uso de memoria. Por último, restaurar el orden original resultó costoso y complejo, y agregaba fricción innecesaria.
La solución: un comparador personalizado
En lugar de modificar los datos de los chats, usamos la propiedad _comparator de la colección:
La restauración es instantánea:

Vista Pending implementada con un orden de chats personalizado (en lugar del cronológico)
Beneficios de rendimiento
El nuevo enfoque trajo beneficios claros de rendimiento sin perder mantenibilidad. Como los objetos de chat no cambian, no hay ninguna mutación de datos, lo que garantiza integridad y confiabilidad. La restauración pasó a ser unas 50 veces más rápida, porque se basa en cambiar el comparador en O(1) en lugar de restaurar timestamps en O(n). También es eficiente en memoria, ya que no hace falta duplicar ni cachear nada. Y al mantener separados los datos y la lógica de ordenamiento, la solución es mucho más fácil de mantener y extender.
La lección
Cuando tus requisitos no encajan en el modelo de datos existente, resiste la tentación de manipular los datos. Busca puntos de extensión del framework que te permitan implementar el comportamiento que necesitas sin romper la integridad de los datos. Las soluciones más elegantes suelen trabajar con el framework, no alrededor de él.
A veces la mejor optimización es no hacer el trabajo: en este caso, no manipular datos cuando puedes manipular el comportamiento.