Dal team di SyncGallery

Da 100.000 file a un milione

Ogni app ha un numero attorno a cui i suoi sviluppatori progettano in silenzio. Il nostro era 100.000 file, finché non sono arrivati gli utenti reali.

La galleria di un telefono che si espande in un vasto campo di miniature di foto ordinate

Un obiettivo che sembrava generoso

Quando abbiamo iniziato a sviluppare SyncGallery, abbiamo scelto un obiettivo di prestazioni chiaro: l'app doveva restare veloce con 100.000 file multimediali su un dispositivo. Abbiamo scritto ogni algoritmo con quel numero in mente e fatto i test con librerie più o meno di quelle dimensioni.

Allora 100.000 file sembravano tanti. Con 30 foto al giorno, tutti i giorni, servirebbero circa nove anni per arrivarci. Eravamo sicuri che nessuno ne avrebbe tenuti di più su un telefono.

Gli utenti ci hanno smentito

Poco dopo la prima versione abbiamo scoperto quanto fosse sbagliata quell'ipotesi. Le librerie reali erano molto più grandi del nostro tetto: anni di archivi della fotocamera, foto trasferite da vecchi telefoni e computer e intere raccolte di famiglia salvate su schede di memoria capienti. Molti telefoni Android accettano ancora schede di memoria da 512 GB o persino da 1 TB, con spazio per librerie molte volte più grandi del nostro obiettivo originale.

L'app non è crollata all'improvviso al file 100.001: i limiti di prestazioni raramente sono così educati. Le operazioni che avrebbero dovuto sembrare istantanee richiedevano invece sensibilmente più tempo, e l'esperienza peggiorava man mano che una libreria superava l'obiettivo. Per chi aveva le librerie più grandi, cioè probabilmente chi ha più bisogno di un'app di backup, non era abbastanza.

Cosa cambia con una scala dieci volte più grande

Molte scorciatoie innocue con 100.000 file diventano problemi con un milione. Lo schema è sempre lo stesso: un costo cresce silenziosamente insieme alla libreria.

  • Tenere tutto in memoria. Un elenco di 100.000 voci sta comodamente nella RAM. Con dieci volte tanto, moltiplicato per schermate e cache, la pressione sulla memoria provoca scatti e, nel caso peggiore, arresti anomali.
  • Ricontrollare ogni file quando ne sono cambiati solo pochi. Riesaminare l'intera libreria perché sono arrivate alcune foto si nota appena con 100.000 file. Con un milione può significare minuti di lavoro in background senza alcun beneficio visibile.
  • Aggiornare lo schermo dopo ogni modifica. Un aggiornamento per ogni file elaborato passa inosservato in una libreria piccola. Quando le modifiche arrivano a decine di migliaia, può bloccare l'interfaccia.
  • Lasciare crescere le cache all'infinito. Una cache senza limiti finisce per competere con le schermate che doveva velocizzare.

Non sono bug esotici. Sono normali decisioni di progettazione che smettono di funzionare un ordine di grandezza più in là.

Ricostruire per un milione

Abbiamo alzato l'obiettivo a un milione di file e abbiamo ripercorso l'app con quel numero come nuovo riferimento. Alcune regole ora guidano tutto ciò che sviluppiamo:

  • Mantenere costante l'uso della memoria mentre la libreria cresce. Le schermate con gli elenchi più pesanti ora caricano i file dal database a finestre invece di tenere tutto in memoria. Le grandi cache di immagini hanno un limite, quindi eliminano le voci più vecchie invece di crescere all'infinito. Questo lavoro prosegue schermata per schermata: è la disciplina con cui ora sviluppiamo, non un traguardo che abbiamo già raggiunto ovunque.
  • Confrontare invece di rileggere. Le scansioni tengono traccia di cosa è cambiato invece di rielaborare tutto. Quando un provider cloud offre un flusso delle modifiche, usiamo quelle modifiche invece di elencare di nuovo intere cartelle.
  • Non far mai aspettare l'interfaccia per la libreria. Il lavoro pesante viene eseguito dietro le quinte, a blocchi. Gli aggiornamenti dello schermo vengono raggruppati, così una raffica di 10.000 modifiche non provoca 10.000 ridisegni.
  • Misurare su dispositivi reali con librerie reali. La profilazione ha sostituito le supposizioni. I miglioramenti maggiori sono arrivati da punti che senza misurare non avremmo mai sospettato.

La velocità è un'abitudine, non un traguardo

Il cambiamento più importante non è stata una singola correzione. È stato rendere la domanda del milione di file parte del modo in cui valutiamo ogni nuova funzione: cosa succede a questa schermata, a questa scansione o a questa cache quando la libreria è dieci volte più grande di quanto ci aspettiamo?

Qualcuno supererà qualsiasi numero scegliamo, e questa volta preferiamo essere pronti.

Se hai una libreria enorme, questo lavoro è stato fatto per te. Se SyncGallery ti sembra lento con la tua raccolta, faccelo sapere: le librerie reali ci insegnano più dei benchmark sintetici.

SyncGallery

Prova SyncGallery

Un'app galleria per Android con una sincronizzazione cloud che controlli tu.

Disponibile su Google Play
Altro dal blogTorna su