Pular para o conteúdo principal
PhotoEditor

( Dados próprios )

Benchmark reproduzível do editor em lote

Quanto tempo o fluxo levou em uma máquina de referência, com a mesma imagem e três repetições por lote. Os números são evidência de um teste, não promessa de velocidade.

Os tempos que medimos

Medições feitas em . Cada valor principal é a mediana de três execuções.

Baixar dados JSON
Medianas por tamanho de lote
ImagensMegapixels totaisUploadAjuste automáticoExportação PNG
11.0 MP836 ms137 ms393 ms
109.6 MP824 ms864 ms1,46 s
2524.0 MP836 ms10,55 s2,51 s

O cronômetro do upload termina quando todas as miniaturas e a prévia central ficam visíveis. O ajuste termina quando o resumo do lote aparece. A exportação termina quando a página de download publica o resumo de concluídos e falhas.

Método reproduzível

Ambiente de referência

Sistema
Windows x64
CPU
12 processadores lógicos
RAM
32 GiB
Chromium
151.0.7922.34
Viewport
1440x900

Entrada e sequência

Cada amostra abre um contexto isolado, carrega cópias da fixture própria de 1200×800 px (0,96 MP), seleciona o lote, executa Ajuste Automático e exporta PNG.

npm run dev -- --port 3218
npm run benchmark:batch

Análise técnica: memória e execução no navegador

Ao editar fotos em lote localmente no navegador, o gargalo principal não é a largura de banda da rede nem a velocidade do disco, mas a memória de mapa de bits descompactada na memória RAM. Quando um arquivo JPEG ou PNG de 500 KB é aberto, o navegador o decodifica em uma matriz bruta de pixels RGBA de 32 bits (ImageData). Cada pixel consome exatamente 4 bytes (Vermelho, Verde, Azul e Alfa). Uma única imagem de 1200×800 px requer aproximadamente 3,84 MB de memória bruta; isso significa que um lote de 25 fotos retém quase 96 MB de dados de pixel na aba do navegador simultaneamente.

Durante o ajuste automático, o processamento ocorre em um Web Worker em segundo plano. Esse worker calcula estatísticas de tom, histogramas de luminância e balanço de cores sem travar a interface da página. Note como o tempo de ajuste escala de forma sublinear entre 10 e 25 imagens: os motores JavaScript JIT modernos (como o V8 no Chromium) otimizam loops e rotas frequentes após o aquecimento inicial, permitindo que imagens consecutivas sejam ajustadas com alta eficiência.

A exportação PNG é consistentemente a etapa mais exigente, pois a codificação de buffers RGBA não compactados em blocos PNG com filtragem de linhas e compressão deflate exige ciclos intensivos de CPU e cálculo de somas de verificação. Quando todas as saídas terminam, a biblioteca JSZip empacota os arquivos em um único arquivo ZIP na memória antes de disparar o download nativo do navegador.

Perguntas sobre este benchmark

Esses tempos valem para o meu computador?
Não necessariamente. O número que importa aqui é a forma da curva entre 1, 10 e 25 imagens, não o valor absoluto. Em um aparelho mais lento todos os tempos sobem, e a proporção entre eles é o que tende a se manter.
Por que apenas três repetições?
Porque o objetivo é dar ordem de grandeza com variação declarada, não precisão estatística. As nove amostras brutas estão no JSON, com mediana e intervalo, para que qualquer leitura possa ser conferida.
Por que não há um número máximo de fotos?
Porque ele não existe de forma estável. A capacidade depende de pixels decodificados, memória livre, armazenamento do navegador e do próprio navegador. Publicar um número seria prometer o que não se pode garantir.
Por que a exportação PNG demora mais que o ajuste automático?
O ajuste automático calcula métricas estatísticas em memória e atualiza a matriz de cor no Web Worker. Já a exportação PNG precisa filtrar cada linha de pixels (Sub, Up, Average, Paeth) e aplicar a compressão zlib/deflate antes de gerar os bytes finais, o que consome consideravelmente mais ciclos de processamento.
Como posso reproduzir estes testes no meu computador?
Basta clonar o repositório do projeto, instalar as dependências e executar o comando exibido no bloco de código acima (npm run benchmark:batch). Ele iniciará uma instância automatizada do Chromium via Playwright, rodará os 9 ciclos de teste e salvará o arquivo JSON com as medianas e intervalos medidos.