Este artículo narra la resolución de un problema de rendimiento en una aplicación de mensajería (Element/Matrix) utilizando Data-Oriented Design (DOD). El problema se manifestaba como una 'congelación' de la lista de salas, un componente crucial para la experiencia del usuario. La causa raíz se identificó como una combinación de 'presión de memoria' y 'contención de bloqueos' (lock contention), problemas comunes en sistemas de bajo nivel, pero que también pueden aparecer en aplicaciones de alto nivel.
La arquitectura del componente de la lista de salas es reactiva, utilizando streams de VectorDiff<Room> para representar las actualizaciones de las salas. VectorDiff es un tipo de dato de la librería eyeball-im que encapsula las modificaciones a un vector observable (similar a un Vec), permitiendo a los observadores suscribirse a los cambios y recibir notificaciones de estos. La lista de salas no almacena las salas directamente, sino un stream de estas diferencias, lo que permite una actualización eficiente de la interfaz de usuario. El proceso de ordenamiento de las salas implica múltiples streams combinados y filtrados, lo que puede generar cuellos de botella.
La solución implementada involucró la optimización del ordenamiento de las salas, utilizando Data-Oriented Design. DOD implica organizar los datos de manera que se minimicen las operaciones de acceso aleatorio y se maximice la localidad de los datos. En este caso, se reestructuró la forma en que se procesaban los streams de actualizaciones, lo que resultó en una mejora del 98.7% en el tiempo de ejecución y un aumento del 7718.5% en el rendimiento (throughput). El artículo explica cómo se utiliza eyeball-im-util para filtrar y ordenar los streams de VectorDiff, proporcionando un ejemplo concreto de cómo se simula un vector ordenado a partir de uno no ordenado.
Consideraciones: El artículo destaca que la optimización del rendimiento no siempre es obvia y requiere una comprensión profunda de la arquitectura del sistema y de los patrones de acceso a los datos. La dependencia de librerías como eyeball-im introduce una complejidad adicional, pero también proporciona herramientas poderosas para la programación reactiva y la optimización del rendimiento. Aunque el artículo no profundiza en todos los aspectos de la implementación, proporciona una visión general del problema, la solución y los beneficios obtenidos a través de Data-Oriented Design.
