Una guía para principiantes sobre la memorización con JavaScript

Una guía para principiantes sobre la memorización con JavaScript

@programacion
Comience a implementar funciones eficientes con memorización

Una de las mejores cosas de ser desarrollador de software es que nunca dejas de aprender. Siempre hay algo que aprender, especialmente con algo como JavaScript. Cuando nuestras aplicaciones se vuelven complejas, la necesidad de velocidad se convierte en un factor decisivo. La optimización del rendimiento se convierte en una necesidad cuando el código de nuestra aplicación crece en escala. La memorización es un concepto que le ayuda a crear aplicaciones eficientes incluso cuando la complejidad es mayor. El concepto de memorización está muy asociado con funciones puras y programación funcional en JavaScript.

Debe tener en cuenta que la memorización es simplemente un concepto y no depende de JavaScript ni de ningún lenguaje de programación específico. En este artículo veremos la memorización desde la perspectiva de JavaScript.

¿Qué es la memorización?

Por definición , la memorización es una técnica de programación para almacenar en caché los resultados de costosos cálculos previos para que puedan recuperarse rápidamente sin esfuerzo repetido cuando se pasan las mismas entradas.

Si desglosa más esta definición, notará que hay tres puntos principales.

  • Almacenamiento en caché de los resultados: la caché es un almacenamiento de datos temporal que permite un acceso más rápido a los datos en el futuro.
  • Cálculos costosos: se refiere a cálculos o procesos que son costosos. El término "caro" significa que estos procesos consumen mucha memoria o llevan mucho tiempo, los cuales son valiosos en el mundo de la informática.
  • Cuando se pasan las mismas entradas: esta es una declaración sencilla. Pero esta declaración confirma la conexión entre la memorización y las funciones puras como se dijo antes. El concepto fundamental de las funciones puras es que el resultado devuelto es siempre el mismo que el argumento de entrada asociado. Puede leer más sobre funciones puras aquí.

Con la ayuda de nuestro enfoque de divide y vencerás, ya deberíamos tener una comprensión básica de la memorización. Si aún no lo entendió, no se preocupe, lo tengo cubierto.

Consejo: Comparta sus componentes reutilizables entre proyectos usando Bit(Github). Bit facilita compartir, documentar y organizar componentes independientes de cualquier proyecto.

Úselo para maximizar la reutilización de código, colaborar en componentes independientes y crear aplicaciones que escalen.

Bit admite Node, TypeScript, React, Vue, Angular y más.

Ejemplo: exploración de componentes React reutilizables compartidos en Bit.dev

¿Cuándo y por qué debería recordar sus funciones?

¿Por qué?

Comencemos con el por qué. La memorización puede ayudarlo enormemente a mejorar el rendimiento de sus costosas llamadas a funciones. Cuando una función recibe una entrada y devuelve una salida después de un cálculo pesado, este valor de retorno se puede almacenar en caché. Si se vuelven a recibir las mismas entradas, es lógico devolver las mismas salidas en lugar de hacer los cálculos desde cero.

Hay varios recursos en línea que analizan las mejoras de rendimiento debidas a la memorización. Puede echar un vistazo a los recursos al final de este artículo para saber más.

¿Cuándo?

La memorización de funciones solo es posible cuando sus funciones son puras. Si su función devuelve diferentes salidas para las mismas entradas, entonces no sirve de nada memorizarla. Eche un vistazo al código a continuación.

Fragmento de código por autor

Aunque la entrada es la misma, la salida es diferente cada vez que se llama a la función. Memorizar una función como esta es inútil.

Además, hay varios casos en los que puede memorizar sus funciones.

  • Son funciones recursivas con valores de entrada que se repiten.
  • Las llamadas a funciones son caras

Conclusiones clave

Foto de Matthew Cabret en Unsplash

Hay tres puntos principales que debe tener en cuenta sobre la memorización. La memorización no existirá sin los conceptos siguientes.

  • Funciones puras: aunque mencioné esto antes, es esencial que una función sea pura para poder memorizarla.
  • Funciones de orden superior: estas funciones devuelven otra función que se puede invocar más adelante.
  • Cierres: el caché que existe dentro de la función puede recordar sus valores gracias a cierres y funciones de orden superior.

Verá estos conceptos en acción en el siguiente ejemplo.

Memorización en acción

Un ejemplo comúnmente utilizado para la memorización sería el cálculo de los factoriales. Echemos un vistazo.

Fragmento de código por autor

En el ejemplo anterior, los cálculos se realizan siempre. En la segunda convocatoria factorial(100)se repite todo el proceso. Si hubiéramos implementado la memorización, no habría necesidad de volver a ejecutar los cálculos, ya que tendríamos el valor de retorno de factorial(100)almacenado en la caché.

Echemos un vistazo al ejemplo anterior implementado con memorización.

Fragmento de código por autor

En el ejemplo anterior, puede ver claramente que se hace referencia a los valores de la caché, siempre que sea necesario. Esto le permite omitir ciertos cálculos ya que sus valores se han calculado previamente.

Si observa de cerca la llamada, puede ver que el cálculo de factorial(50)es bastante rápido ya que no hay ningún cálculo involucrado. Esto se debe al valor de factorial(50)estar ya calculado y almacenado en caché en la factorial(60)ejecución.

Puedes jugar con este ejemplo de aquí .

Cosas a tener en cuenta sobre el ejemplo anterior

Puede ver claramente que la función factorial anterior es una función pura, ya que siempre devuelve el mismo valor de salida para la misma entrada. También puede notar que la función memoize es una función de orden superior en el ejemplo anterior, ya que devuelve una función que se puede invocar más tarde y también usa la función pasada como argumento. Además, también se puede observar que debido al uso de la función de orden superior, se crea un cierre que permite que la función interna acceda al objeto de caché.

Ahora podemos ver cómo se puede memorizar una función aplicándole tres conceptos importantes.

Almacenamiento en caché vs memorización

Puede comenzar a preguntarse acerca de la diferencia entre el almacenamiento en caché y la memorización. Bueno, de hecho, el almacenamiento en caché puede ser posible de varias formas, como caché HTTP, caché de imágenes, etc. Pero la memorización se preocupa más por un tipo específico de almacenamiento en caché, el almacenamiento en caché de valores de retorno de una función .

También debe tener en cuenta que ya he mencionado los puntos clave de la memorización. Por lo tanto, el almacenamiento en caché es solo una parte de la memorización, no la memorización en sí.

Bibliotecas para memorización

Hay varias bibliotecas que le ayudan a memorizar sus funciones, pero se diferencian entre sí por la forma en que se implementa la memorización.

  • Moize
  • Lodash
  • Underscore
  • Memoize Immutable y más.

Puede echar un vistazo a todas las bibliotecas y sus características en esta respuesta de stackoverflow de Venryx.

¿Debería recordar siempre sus funciones?

R:/ No

Aunque la memorización aumenta su rendimiento por un gran margen, hay algo más que debe tener en cuenta. La caché almacena los valores, lo que implica que se están almacenando datos. Si las entradas de su función varían con un rango enorme, entonces su caché será cada vez más grande. Normalmente, las funciones memorizadas tienen una complejidad espacial de O (n). Pero hay algoritmos que pueden mejorar la complejidad espacial de las funciones memorizadas.

Es muy importante que comprenda que debe equilibrar dos recursos importantes: el tiempo y el espacio. Aunque la memorización reduce la complejidad temporal de una función, por otro lado aumenta la complejidad espacial.

Por lo tanto, creo que es adecuado implementar la memorización cuando el rango de entrada es fijo y se puede asegurar que a menudo serán repetitivos.

Recursos

Artículo de Philip

Artículo de Codesmith

Artículo de Divyanshu

Lecture Notes - Carnegie Mellon University

MDN Docs

Enlace del articulo


Report Page