# Cómo la lista de desinstalación de Mole aparece al hacer clic

> Adónde se iba el segundo o más de cada clic al desinstalar, qué pasó a segundo plano y por qué las 15.000 carpetas temporales de ChatGPT comparten ahora una fila.

Published: 2026-10-28

Al hacer clic en una app en la página de desinstalación de Mole, la parte derecha se quedaba un momento en blanco, luego mostraba «Analizando», y solo después de medio segundo a un segundo aparecían los restos. Xcode tardaba tres o cuatro segundos en cada clic, ChatGPT seis, y al desplazarse por la lista desplegada de ChatGPT había tirones. Quería ver en qué se iba realmente ese tiempo, y de paso miré cómo resuelven el mismo problema algunos desinstaladores de código abierto. Los cambios quedaron listos el 5 de octubre y llegaron con Mole 1.16.0; esto es lo que medí entonces y las decisiones que tomé.

## Lo lento no era la app

Esperaba que las apps grandes fueran más lentas, y no fue así: una utilidad pequeña de 6,6 MB con seis restos seguía tardando unos 0,56 segundos en el primer clic. La mayor parte del tiempo se iba en unas cuantas tareas fijas que se ejecutaban en cada clic. Son medianas de tres pasadas con una compilación Release en mi M5 Pro:

- Leer el catálogo de casks de Homebrew, un archivo de 5,6 MB, costaba unos 200 ms cada vez, solo para saber si la app se había instalado con Homebrew.
- La firma de código de la app se validaba, y dos veces, a razón de 1 ms por MB de ejecutable aproximadamente; MindNode gastaba 260 ms en ello por clic.
- La tarea de análisis más lenta era la lista de documentos recientes: unos 230 ms para 775 entradas, casi todo comprobando rutas una por una.

Algunas apps añadían su propio coste. El recibo de instalación de Xcode ocupa 41 MB y enumera 125.000 rutas, y se volvía a leer en cada clic. ChatGPT deja unas 15.000 carpetas temporales, y había que comprobar una por una que fueran suyas.

## Qué cambió

- El catálogo de casks se lee en segundo plano en cuanto se abre la página de desinstalación, no al hacer clic.
- El clic lee la información de firma sin validarla y fija la app por su identidad de archivo. La validación completa se ejecuta en segundo plano después de que aparece la lista, y tiene que terminar antes de borrar nada.
- Los documentos recientes se filtran primero por nombre; solo los que coinciden pasan por la comprobación completa de propiedad.
- Las raíces de la biblioteca se listan en paralelo, la identidad de los contenedores se guarda en caché por archivo de metadatos, y los prefijos de identificador de los programas auxiliares se calculan una vez por análisis.
- Los recibos de instalación se guardan en caché por archivo de recibo, así que un segundo clic en Xcode no vuelve a leer esos 41 MB.
- Las carpetas temporales cuyo nombre ya demuestra a quién pertenecen toman un camino rápido; el paso de borrado sigue comprobando cada ruta.
- Las tareas de análisis largas empiezan primero, y los cientos de tareas pequeñas esperan detrás.
- Un análisis iniciado al pasar el puntero se detiene cuando el puntero se va, y un análisis iniciado antes de una desinstalación ya no puede escribir resultados obsoletos después.

Con la validación de firma, lo más fácil habría sido quitarla. En su lugar la moví a después del clic. Ahora, cuando la validación en segundo plano falla, la app se desinstala igualmente, y solo se quedan los tipos de restos que se encontraron a través de la información de firma, como los contenedores asociados por el ID de equipo del desarrollador. El resultado los muestra como «No se pudo verificar la firma de la app», conservados en lugar de fallidos. Una app sustituida por otra después del análisis se sigue rechazando.

## Cuánto más rápido

Primer clic unos 1,5 segundos después de abrir la página de desinstalación, compilación Release:

| App | Antes | Después |
| --- | --- | --- |
| Shottr | 556 ms | 137 ms |
| MindNode | 1233 ms | 169 ms |
| Raycast | 716 ms | 171 ms |
| Parallels Desktop | 871 ms | 194 ms |
| VS Code | 584 ms | 232 ms |
| WeChat | 605 ms | 238 ms |
| Xcode | 3689 ms | 384 ms |
| ChatGPT | 6134 ms | 1530 ms |

La mayoría de las apps habituales quedan ahora por debajo de 250 ms, de modo que los restos aparecen de una vez, sin mostrar antes «Analizando». La validación de firma en segundo plano termina entre 12 y 434 ms después de que aparece la lista.

## Las quince mil filas de ChatGPT

Con los clics ya rápidos, desplazarse por un ChatGPT desplegado seguía dando tirones. Mostraba 15.175 filas, y 15.143 eran carpetas temporales del tipo `T/.com.openai.codex.XXXXXX`, 1,0 GB en total, unas cuantas más cada vez que se abre la app. Hina, una app que hago yo, era parecida: 323 de sus 344 filas eran archivos `Hina-<Suite>-<UUID>.plist` dejados por pruebas, 0,01 MB entre todos. En ambos casos, una sola forma con nombre aleatorio llenaba casi toda la lista.

El número de filas no era la única causa. La fila desplegada reordenaba todos los restos cada vez que se redibujaba, y pasar el puntero redibujaba toda la fila de la app, así que cada fila que se deslizaba bajo un puntero quieto provocaba otra ordenación. Con los datos reales de ChatGPT, un redibujado pasó de 309 a 354 ms a 56 a 58 ms, Hina de 33 a 36 ms a 17 a 19 ms, y la altura desplegada de ChatGPT bajó de 3200 pt a 1225 pt.

Ahora varias filas comparten una sola cuando tienen la misma categoría, carpeta, propietario y selección por defecto, y sus nombres solo difieren en una parte que generó la app: un sufijo aleatorio, un UUID, una larga secuencia hexadecimal o la marca de tiempo de un informe de fallo. La fila compartida conserva la etiqueta de categoría, muestra la ruta con `*` en lugar de la parte que cambia, seguida del número de elementos y el tamaño total, con una sola casilla, y no se despliega. ChatGPT bajó a 33 filas en 13 categorías, Hina a 24.

<figure class="blog-diagram">
  <picture>
    <source media="(max-width: 900px)" srcset="/img/blog/uninstall-leftovers-one-line-mobile.webp">
    <img src="https://mole.fit/img/blog/uninstall-leftovers-one-line.webp" width="1600" height="992" loading="lazy" alt="Los mismos restos de ChatGPT antes y después: antes, cada carpeta temporal tiene su propia fila; después, comparten una fila que indica 15.143 elementos y 1,02 GB, y el resto de los restos aparece por categorías.">
  </picture>
  <figcaption>Los mismos restos de ChatGPT, una fila por carpeta temporal antes, una fila compartida después.</figcaption>
</figure>

Las carpetas hermanas con nombre propio conservan cada una su fila, como las siete cachés de Electron de ChatGPT, `GPUCache`, `Code Cache`, `Crashpad` y las demás. Fusionarlas también habría dejado a Hina con unas siete filas, y eso ya no parece una limpieza a fondo; una docena larga es lo justo. Un nombre que lleva una palabra de seis letras, como `T/<id>.helper`, también se queda en su propia fila, porque seis letras por sí solas no se distinguen de un sufijo aleatorio.

Dos intentos anteriores siguieron descartados. Uno anidaba un grupo plegable dentro de la fila de la app ya desplegada; se probó el 30 de septiembre y se quitó el 2 de octubre, porque metía un plegado dentro de otro y repartía rutas parecidas entre el grupo y filas sueltas. El otro mostraba una fila por categoría; se usó desde el 4 de septiembre y se revirtió una semana después, porque escondía ubicaciones distintas detrás de una sola fila.

## Cómo lo hacen otros desinstaladores

Pearcleaner lista unas 62 raíces en paralelo y compara por nombre, sin prueba de propiedad ni caché; es rápido porque hace menos. Tencent Lemon calcula los restos de todas las apps al entrar en la página y los actualiza a diario, así que los clics son instantáneos, a cambio de un gran análisis en segundo plano en cada visita, lo que va contra la regla de Mole de no añadir trabajo residente. MangoDisk, Uninstally y Mole CLI usan raíces fijas con concurrencia limitada.

Ninguno tenía una primitiva de bajo nivel más rápida que `getattrlistbulk` y `readdir`, que Mole ya usa. También probé Spotlight: cada consulta tardaba 0,3 a 0,4 segundos y se dejaba la mayoría de los restos, ya que encontró uno de los cuatro de VS Code, mientras que `searchfs` funciona en APFS pero tarda unos 15 segundos por consulta. Así que el trabajo se redujo a quitar tareas repetidas del análisis que Mole ya tenía. Para saber cómo leer esa lista de restos antes de borrar nada, sigue con [Restos de apps en el Mac: revisa antes de borrar](https://mole.fit/es/blog/mac-uninstall-leftovers-review-before-delete).

---

Canonical HTML page: https://mole.fit/es/blog/mole-uninstall-review-speed
Blog index for agents: https://mole.fit/es/blog/llms.txt
Site index for agents: https://mole.fit/llms.txt
