Da equipa da SyncGallery

De 100 000 ficheiros a um milhão

Todas as apps têm um número em torno do qual os programadores trabalham discretamente. O nosso era 100 000 ficheiros—até aparecerem os utilizadores reais.

Uma galeria de telemóvel a expandir-se num vasto campo de miniaturas de fotos organizadas

Um objetivo que parecia generoso

Quando começámos a criar a SyncGallery, escolhemos um objetivo de desempenho claro: a app tinha de continuar rápida com 100 000 ficheiros multimédia num dispositivo. Escrevemos todos os algoritmos a pensar nesse número e testámos com bibliotecas de aproximadamente esse tamanho.

Na altura, 100 000 ficheiros pareciam generosos. A 30 fotos por dia, todos os dias, seriam precisos cerca de nove anos para chegar a esse total. Estávamos confiantes de que ninguém guardaria mais do que isso num telemóvel.

Os utilizadores provaram que estávamos errados

Pouco depois do primeiro lançamento, percebemos o quanto essa suposição estava errada. As bibliotecas reais eram muito maiores do que o nosso limite: anos de arquivos da câmara, fotos migradas de telemóveis e computadores antigos e coleções familiares inteiras guardadas em cartões de memória grandes. Muitos telemóveis Android ainda aceitam cartões de memória de 512 GB ou até 1 TB—espaço para bibliotecas muitas vezes maiores do que o nosso objetivo original.

A app não deixou de repente de funcionar no ficheiro 100 001—os limites de desempenho raramente são assim tão educados. Em vez disso, operações que deviam parecer instantâneas demoravam visivelmente mais, e a experiência piorava à medida que a biblioteca crescia para lá do objetivo. Para as pessoas com as maiores bibliotecas—possivelmente as que mais precisam de uma app de cópia de segurança—isso não era suficientemente bom.

O que muda a uma escala dez vezes maior

Muitos atalhos inofensivos com 100 000 ficheiros tornam-se problemas com um milhão. O padrão é sempre o mesmo: um custo cresce discretamente com a biblioteca.

  • Manter tudo em memória. Uma lista de 100 000 entradas cabe confortavelmente na RAM. Com dez vezes esse tamanho, multiplicado por ecrãs e caches, a pressão sobre a memória provoca engasgos e, no pior dos casos, falhas.
  • Voltar a verificar todos os ficheiros quando só alguns mudaram. Reexaminar toda a biblioteca porque chegou um punhado de fotos quase não se nota com 100 000 ficheiros. Com um milhão, pode significar minutos de trabalho em segundo plano sem qualquer benefício visível.
  • Atualizar o ecrã após cada alteração. Uma atualização por cada ficheiro processado não se nota numa biblioteca pequena. Quando as alterações chegam às dezenas de milhares, pode bloquear a interface.
  • Deixar as caches crescer para sempre. Uma cache sem limites acaba por competir com os próprios ecrãs que devia acelerar.

Não são erros exóticos. São decisões de engenharia comuns que deixam de funcionar uma ordem de grandeza mais tarde.

Reconstruir para um milhão

Aumentámos o objetivo para um milhão de ficheiros e voltámos a percorrer a app com esse número como nova fasquia. Algumas regras moldam agora tudo o que criamos:

  • Manter o uso de memória estável à medida que a biblioteca cresce. Os ecrãs de listas mais pesados carregam agora os ficheiros da base de dados por janelas, em vez de manterem tudo em memória. As caches de imagens grandes têm limites, pelo que descartam entradas mais antigas em vez de crescerem para sempre. Esta implementação continua ecrã a ecrã; é a disciplina com que agora trabalhamos, não uma meta que já tenhamos cruzado em todo o lado.
  • Comparar em vez de voltar a ler. As análises acompanham o que mudou em vez de voltarem a processar tudo. Quando um fornecedor de nuvem disponibiliza um feed de alterações, consumimos essas alterações em vez de voltarmos a listar pastas inteiras.
  • Nunca fazer a interface esperar pela biblioteca. O trabalho pesado é executado nos bastidores, em lotes. As atualizações do ecrã são combinadas para que uma rajada de 10 000 alterações não provoque 10 000 redesenhos.
  • Medir em dispositivos reais com bibliotecas reais. A análise de desempenho substituiu os palpites. Os maiores ganhos vieram de sítios de que nunca teríamos suspeitado sem medir.

A rapidez é um hábito, não uma meta

A mudança mais importante não foi nenhuma correção isolada. Foi tornar a pergunta do milhão de ficheiros parte da forma como avaliamos cada nova funcionalidade: o que acontece a este ecrã, análise 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 tem uma biblioteca enorme, este trabalho foi feito a pensar em si. Se alguma vez a SyncGallery parecer lenta com a sua coleção, diga-nos—as bibliotecas reais ensinam-nos mais do que os testes de referência sintéticos.

SyncGallery

Experimente a SyncGallery

Uma app de galeria para Android com sincronização na nuvem sob o seu controlo.

Disponível no Google Play
Mais do blogueVoltar ao início