Da equipe do SyncGallery

De 100 mil arquivos a um milhão

Todo app tem um número em torno do qual os desenvolvedores projetam discretamente. O nosso era 100 mil arquivos—até os usuários reais aparecerem.

Uma galeria de celular se expandindo em um vasto campo de miniaturas de fotos organizadas

Uma meta que parecia generosa

Quando começamos a criar o SyncGallery, escolhemos uma meta de desempenho clara: o app precisava continuar rápido com 100 mil arquivos de mídia no dispositivo. Escrevemos cada algoritmo com esse número em mente e testamos com bibliotecas mais ou menos desse tamanho.

Na época, 100 mil arquivos pareciam bastante. Com 30 fotos por dia, todos os dias, levaria uns nove anos para chegar a esse total. Tínhamos certeza de que ninguém guardaria mais do que isso em um celular.

Os usuários provaram o contrário

Pouco depois do primeiro lançamento, descobrimos o quanto essa suposição estava errada. As bibliotecas reais eram muito maiores que o nosso teto: anos de arquivos da câmera, fotos migradas de celulares e computadores antigos e coleções inteiras da família guardadas em cartões de memória grandes. Muitos celulares Android ainda aceitam cartões de memória de 512 GB ou até 1 TB—espaço para bibliotecas muitas vezes maiores que a nossa meta original.

O app não quebrou de repente no arquivo 100.001—limites de desempenho raramente são tão educados. Em vez disso, operações que deveriam parecer instantâneas passaram a demorar visivelmente mais, e a experiência continuou piorando à medida que a biblioteca crescia além da meta. Para quem tinha as maiores bibliotecas—justamente quem talvez mais precise de um app de backup—isso não era bom o suficiente.

O que muda com uma escala dez vezes maior

Muitos atalhos inofensivos com 100 mil arquivos se tornam problemas com um milhão. O padrão é sempre o mesmo: um custo cresce silenciosamente junto com a biblioteca.

  • Manter tudo na memória. Uma lista de 100 mil entradas cabe com folga na RAM. Com dez vezes esse tamanho, multiplicado por telas e caches, a pressão sobre a memória causa travamentos momentâneos e, no pior caso, falhas.
  • Verificar de novo todos os arquivos quando só alguns mudaram. Reexaminar a biblioteca inteira porque chegaram algumas fotos mal é perceptível com 100 mil arquivos. Com um milhão, isso pode significar minutos de trabalho em segundo plano sem nenhum benefício visível.
  • Atualizar a tela a cada alteração. Uma atualização por arquivo processado passa despercebida em uma biblioteca pequena. Quando as alterações chegam às dezenas de milhares, isso pode congelar a interface.
  • Deixar os caches crescerem para sempre. Um cache sem limite acaba competindo com as próprias telas que deveria acelerar.

Esses não são bugs exóticos. São decisões comuns de engenharia que deixam de funcionar uma ordem de grandeza depois.

Reconstruindo para um milhão

Elevamos a meta para um milhão de arquivos e revisamos o app com esse número como o novo padrão. Algumas regras agora orientam tudo o que construímos:

  • Manter o uso de memória estável à medida que a biblioteca cresce. As telas de lista mais pesadas agora carregam os arquivos do banco de dados em janelas, em vez de manter tudo na memória. Os caches de imagens grandes têm limite, então descartam entradas antigas em vez de crescer para sempre. Essa implantação continua tela por tela; é a disciplina que seguimos agora, não uma linha de chegada que já cruzamos em todo lugar.
  • Comparar em vez de reler. As verificações acompanham o que mudou em vez de reprocessar tudo. Quando um provedor de nuvem oferece um feed de alterações, consumimos essas alterações em vez de listar pastas inteiras de novo.
  • Nunca fazer a interface esperar pela biblioteca. O trabalho pesado roda nos bastidores, em lotes. As atualizações de tela são combinadas, para que uma rajada de 10.000 alterações não dispare 10.000 redesenhos.
  • Medir em dispositivos reais com bibliotecas reais. A criação de perfis substituiu os palpites. Os maiores ganhos vieram de lugares de que nunca teríamos suspeitado sem medir.

Rapidez é um hábito, não um marco

A mudança mais importante não foi nenhuma correção isolada. Foi tornar a pergunta do milhão de arquivos parte da forma como avaliamos cada novo recurso: o que acontece com esta tela, verificação ou cache quando a biblioteca for dez vezes maior do que esperamos?

Alguém vai ultrapassar qualquer número que escolhermos, e desta vez preferimos estar preparados.

Se você tem uma biblioteca enorme, este trabalho foi feito para você. Se o SyncGallery parecer lento com a sua coleção, conte para nós—bibliotecas reais nos ensinam mais do que benchmarks sintéticos.

SyncGallery

Experimente o SyncGallery

Um app de galeria para Android com sincronização na nuvem que você controla.

Disponível no Google Play
Mais do blogVoltar ao topo