Esta semana será un artículo corto, solo tocaré algunas técnicas de optimización que retomé por casualidad, vamos a ello:
Problema
Digamos que tengo un sitio de una pizzeria y el usuario debe elegir los ingredientes que quiere para su pizza. En el caso de incluir piña le das un mensaje personalizado.
![Caso utilizando includes](https://res-3.cloudinary.com/ngxcoder/image/upload/f_auto,q_auto/v1/blog-images/carbon123123.png)
Lo más clásico es que utilices algo como find, some o includes para encontrar el elemento que deseas comprobar. Esto suele ser una iteración con una complejidad de O(n) y hay formas de optimizar esto:
Utilizando Set
Set es una característica traída por ES6.
![Caso utilizando Set](https://res-3.cloudinary.com/ngxcoder/image/upload/f_auto,q_auto/v1/blog-images/carbon1231.png)
Set, a diferencia de array.includes(), tiene una complejidad de O(1); pero ¿por qué ocurre esto?
Map, Set, WeakSet y WeakMap utilizan tablas hash. Esas tablas hash se apoyan de arrreglos o diccionarios, si quieres indagar más te dejo la ruta directa de un árticulo de V8:
![](https://v8.dev/_img/hash-code/properties-backing-store-empty.png)
No todo es ventajas
Hay algunas puntos en contra muy evidentes:
- Los Sets manejan valores únicos.
- Si deseas buscar un valor dentro de Set utilizando has() debe ser un valor primitivo por conveniencia. Si comparas objetos, compararás sus referencias y seguro no quieres eso.
Memoization
Esta es una técnica utilizada para guardar los resultados de una operación costosa.
El navegador lo hace todo el tiempo cuando entras a un sitio nuevo:
- El usuario carga el sitio por primera vez descargando las imágenes, se guarda en el navegador.
- El usuario cierra el navegador.
- El usuario entra por segunda vez y las imágenes son cargadas desde lo guardado previamente.
![https://www.keycdn.com/support/web-cache](https://res-1.cloudinary.com/ngxcoder/image/upload/f_auto,q_auto/v1/blog-images/web-cache-lg%402x.webp)
Así funciona el caché del navegador muy resumido, ya que hay múltiples consideraciones como la fecha de expiración y los diversos tipos de encabezados.
El concepto es guardar los resultados ya obtenidos en algún diccionario o espacio para que al presentarse el mismo caso no se tenga que realizar operaciones innecesarias, eso es todo.
Aplica en otras áreas como:
- Evitar consultas constantes a la base de datos
- Evitar realizar un calculo costoso dentro de los mecanismos del renderizado de una página
- Evitar ejecutar una función recursiva que ya fue ejecutada previamente
Referencias
![](https://v8.dev/_img/hash-code/properties-backing-store-empty.png)
![](https://www.gitbook.com/cdn-cgi/image/width=40,height=40,fit=contain,dpr=1,format=auto/https%3A%2F%2F490253082-files.gitbook.io%2F~%2Ffiles%2Fv0%2Fb%2Fgitbook-28427.appspot.com%2Fo%2Fspaces%2F-L9CoGJCq3UCfKJ7RCUg%2Favatar.png%3Fgeneration%3D1522797881064033%26alt%3Dmedia)
![](https://developer.mozilla.org/mdn-social-share.0ca9dbda.png)