Vai al contenuto principale

Questo è il sito di Mole per Mac. Vuoi passare al sito della versione per Windows?

Vai al sito Windows
Mole
MacWindows
Funzioni Testate Voci Prezzo FAQ Blog
EnglishEN 简体中文中 繁體中文繁 日本語日 한국어한 FrançaisFR DeutschDE ItalianoIT EspañolES PortuguêsPT NederlandsNL
Acquista Scarica

    Aiuto, documentazione, versioni e articoli.

    Blog

    Far comparire subito la lista di disinstallazione di Mole

    Su MolePubblicato 28 ottobre 20267 min di lettura

    Facendo clic su un’app nella pagina di disinstallazione di Mole, la parte destra restava vuota per un attimo, poi compariva «Scansione in corso», e solo dopo mezzo secondo o un secondo apparivano i residui. Xcode richiedeva tre o quattro secondi a ogni clic, ChatGPT sei, e scorrendo la lista espansa di ChatGPT si avvertivano scatti. Volevo vedere dove andasse davvero quel tempo, e intanto ho guardato come alcuni programmi di disinstallazione open source affrontano lo stesso problema. Le modifiche erano pronte il 5 ottobre e sono arrivate con Mole 1.16.0; ecco cosa ho misurato allora e i compromessi che ho scelto.

    Lenta non era l’app

    Mi aspettavo che le app più grandi fossero più lente, e invece no: un piccolo strumento da 6,6 MB con sei residui richiedeva comunque circa 0,56 secondi al primo clic. Gran parte del tempo se ne andava in alcuni lavori fissi eseguiti a ogni clic. Sono mediane di tre esecuzioni con una build Release sul mio M5 Pro:

    • Leggere il catalogo dei cask di Homebrew, un file da 5,6 MB, costava circa 200 ms ogni volta, solo per capire se l’app era stata installata con Homebrew.
    • La firma del codice dell’app veniva verificata, due volte, a circa 1 ms per MB di eseguibile; MindNode ci spendeva 260 ms a clic.
    • L’attività di scansione più lenta era l’elenco dei documenti recenti: circa 230 ms per 775 voci, quasi tutti spesi a controllare i percorsi uno per uno.

    Alcune app aggiungevano un costo tutto loro. La ricevuta di installazione di Xcode pesa 41 MB ed elenca 125.000 percorsi, e veniva riletta a ogni clic. ChatGPT lascia circa 15.000 cartelle temporanee, e per ognuna bisognava verificare che fosse davvero sua.

    Cosa è cambiato

    • Il catalogo dei cask viene letto in background appena si apre la pagina di disinstallazione, non al clic.
    • Il clic legge le informazioni di firma senza verificarle e fissa l’app tramite l’identità del file. La verifica completa gira in background dopo che la lista è comparsa, e deve finire prima di eliminare qualsiasi cosa.
    • I documenti recenti vengono prima filtrati per nome; solo quelli che corrispondono passano dal controllo completo di appartenenza.
    • Le radici della libreria vengono elencate in parallelo, l’identità dei contenitori viene messa in cache per file di metadati, e i prefissi degli ID dei programmi ausiliari si calcolano una volta per scansione.
    • Le ricevute di installazione vanno in cache per file di ricevuta, così un secondo clic su Xcode non rilegge quei 41 MB.
    • Le cartelle temporanee il cui nome da solo dimostra a chi appartengono prendono una via rapida; la fase di eliminazione controlla comunque ogni percorso.
    • Le scansioni lunghe partono per prime, e le centinaia di attività piccole si mettono in coda dietro.
    • Una scansione avviata passando il puntatore si ferma quando il puntatore si allontana, e una scansione avviata prima di una disinstallazione non può più scrivere risultati vecchi dopo.

    Per la verifica della firma, la strada più comoda sarebbe stata toglierla. L’ho invece spostata dopo il clic. Ora, se la verifica in background non va a buon fine, l’app viene comunque disinstallata, e restano solo i tipi di residui trovati attraverso le informazioni di firma, come i contenitori associati tramite l’ID del team dello sviluppatore. Il risultato li indica come «Impossibile verificare la firma dell'app», conservati anziché falliti. Un’app sostituita da un’altra dopo la scansione viene ancora rifiutata.

    Quanto più veloce

    Primo clic circa 1,5 secondi dopo aver aperto la pagina di disinstallazione, build Release:

    App Prima Dopo
    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 maggior parte delle app comuni ora resta sotto i 250 ms, così i residui compaiono in un solo passaggio, senza mostrare prima «Scansione in corso». La verifica della firma in background finisce tra 12 e 434 ms dopo la comparsa della lista.

    Le quindicimila righe di ChatGPT

    Con i clic ormai veloci, scorrere un ChatGPT espanso andava ancora a scatti. Elencava 15.175 righe, e 15.143 erano cartelle temporanee del tipo T/.com.openai.codex.XXXXXX, 1,0 GB in tutto, qualcuna in più a ogni avvio dell’app. Hina, un’app che sviluppo io, era simile: 323 delle sue 344 righe erano file Hina-<Suite>-<UUID>.plist lasciati dai test, 0,01 MB in tutto. In entrambi i casi un’unica forma con nome casuale riempiva quasi tutta la lista.

    Il numero di righe non era l’unica causa. La riga espansa riordinava tutti i residui a ogni ridisegno, e il passaggio del puntatore ridisegnava l’intera riga dell’app, quindi ogni riga che scivolava sotto un puntatore fermo faceva partire un nuovo ordinamento. Con i dati reali di ChatGPT, un ridisegno è sceso da 309–354 ms a 56–58 ms, Hina da 33–36 ms a 17–19 ms, e l’altezza espansa di ChatGPT è passata da 3200 pt a 1225 pt.

    Ora più righe condividono una sola riga quando hanno la stessa categoria, cartella, proprietario e selezione predefinita, e i loro nomi differiscono solo in una parte generata dall’app: un suffisso casuale, un UUID, una lunga sequenza esadecimale o l’orario di un rapporto di arresto anomalo. La riga condivisa mantiene l’etichetta della categoria, mostra il percorso con * al posto della parte che cambia, seguito dal numero di elementi e dalla dimensione totale, con una sola casella, e non si espande. ChatGPT è sceso a 33 righe in 13 categorie, Hina a 24.

    Gli stessi residui di ChatGPT prima e dopo: prima ogni cartella temporanea ha la sua riga, dopo condividono una riga con 15.143 elementi e 1,02 GB, e gli altri residui sono elencati per categoria.
    Gli stessi residui di ChatGPT, prima una riga per cartella temporanea, dopo una riga condivisa.

    Le cartelle sorelle con un nome proprio mantengono ciascuna la sua riga, come le sette cache Electron di ChatGPT, GPUCache, Code Cache, Crashpad e le altre. Unire anche quelle avrebbe lasciato Hina con circa sette righe, e non sembrerebbe più una pulizia accurata; una dozzina abbondante è la misura giusta. Anche un nome con una parola di sei lettere, come T/<id>.helper, resta su una riga a sé, perché sei lettere da sole non si distinguono da un suffisso casuale.

    Due tentativi precedenti sono rimasti scartati. Uno annidava un gruppo comprimibile dentro la riga dell’app già espansa; provato il 30 settembre e tolto il 2 ottobre, perché metteva un’espansione dentro un’altra e divideva percorsi simili tra il gruppo e righe sparse. L’altro mostrava una riga per categoria; usato dal 4 settembre e annullato una settimana dopo, perché nascondeva posizioni diverse dietro una sola riga.

    Come fanno gli altri programmi di disinstallazione

    Pearcleaner elenca circa 62 radici in parallelo e confronta per nome, senza prova di appartenenza e senza cache; è veloce perché fa meno. Tencent Lemon calcola i residui di tutte le app appena si entra nella pagina e li aggiorna ogni giorno, quindi i clic sono istantanei, al prezzo di una grossa scansione in background a ogni visita, cosa che va contro la regola di Mole di non aggiungere lavoro residente. MangoDisk, Uninstally e Mole CLI usano radici fisse con un parallelismo limitato.

    Nessuno aveva una primitiva di basso livello più veloce di getattrlistbulk e readdir, che Mole usa già. Ho provato anche Spotlight: ogni query richiedeva 0,3–0,4 secondi e mancava la maggior parte dei residui, trovandone uno solo dei quattro di VS Code, mentre searchfs funziona su APFS ma richiede circa 15 secondi per query. Alla fine il lavoro si è ridotto a togliere i lavori ripetuti dalla scansione che Mole aveva già. Per capire come leggere quella lista di residui prima di eliminare qualcosa, prosegui con Disinstallare app sul Mac: controlla i residui prima di eliminarli.

    Il Mac è a corto di spazio o rallenta? Mole può fare pulizia, rimuovere del tutto le app e mantenere macOS in forma.

    Prova Mole

    Continua a leggere

    • Su MoleMole CLI o l’app Mole per Mac8 min di lettura
    • Su MoleDopo aver rispedito oltre 400 e-mail di licenza Mole5 min di lettura
    • Su MoleMeno impostazioni, scelte più chiare4 min di lettura

    Mole · 鼴

    Pulizia, app e stato del Mac.

    v1.19.0 (348) · Versioni

    Prodotto

    Pulizia Mac Disinstallazione app Manutenzione Mac Analisi disco Monitor di sistema

    Supporto

    Aiuto Documentazione Versioni Blog

    Note legali

    Termini di servizio Informativa sulla privacy Politica di rimborso

    Risorse

    Per Windows Strumento CLI Programma di affiliazione

    Contatti

    Twitter hi@mole.fit

    L’unico sito ufficiale di Mole mole.fit · Evita i file di installazione di provenienza sconosciuta

    La CLI resta gratuita per il terminale.