Atualizações de desempenho do Flutter em 2019
Postagem de Yuqian Li e Shams Zakhour
A velocidade é um valor fundamental para o Flutter. Este artigo destaca as melhorias de desempenho que foram implementadas por membros da comunidade do Flutter a partir do segundo semestre de 2019. Sim, estamos atrasados, mas antes tarde do que nunca!
Caso você tenha contribuído com o desempenho do Flutter em 2020, abordaremos essas atualizações em uma publicação futura. Ao compartilhar estes resultados com você e a comunidade do Flutter, esperamos inspirar a todos a continuar contribuindo!
Quarto trimestre (de outubro a dezembro) de 2019
Melhorias em números

70% de redução de memória na rolagem rápida de imagens grandes
colaboradores: liyuqian, dnfield e chinmaygarde
- PR 14265: limpeza de GrContext do thread de E/S
- PR 46184: teste de memória ao rolar imagens grandes rapidamente
- Painel: redução de 70% (de 400 MB para 120 MB) em fast_scroll_large_images__memory diff-median
- Problema 19558: é necessário limpar a memória de GrContext do thread de E/S
Redução de 40% no uso de CPU/GPU em animações simples para iOS
colaboradores: flar, liyuqian, hixie e chinmaygarde
- PR 14104: trabalhar em uma condicional mais simples fora da tela para oferecer suporte à leitura
- PR 13976: determinar de modo dinâmico o uso da superfície fora da tela com base na necessidade
- PR 31865: uma animação simples resulta em um uso alto de CPU/GPU/energia (aproximadamente 20%) no iPhone 6
- Redução de 40% (de 23%-CPU-14%-GPU para 13%-CPU-8,5%-GPU) em simple_animation_perf_iphonexs cpu_percentage, gpu_percentage
Aceleração de 41% no desempenho do cursor
colaboradores: garyqian, liyuqian e justinmc
- PR 46720: passar _caretPrototype para evitar falta de cache
- PR 46720: aceleração de 41% (de 6,709 ms para 4,756 ms) no 90º percentil do momento de compilação do frame
- Problema corrigido 24522: o desempenho do cursor é ruim, há um tempo longo de GPU por frame
Aceleração de 10% para rolagem de lista com a correção do limite do cache de varredura
colaboradores: liyuqian, chinmaygarde, flar, cyanglaz e zsunkun
- PR 31865: uma animação simples resulta em um uso alto de CPU/GPU/energia (aproximadamente 20%) no iPhone 6
- PR 13710: corrigir o limite do cache de varredura de imagem
- PR 45050: adicionar um teste de desempenho para o cache de varredura de imagem
- Correção de um problema de bloqueador, 43083: a rolagem de lista não é suave com PR 13710: corrigir o limite do cache de varredura de imagem
Aceleração de 37x para o tempo de carregamento de referências em cache (Painel)
colaboradores: caseyhillers, tvolkert, digiter e jonahwilliams
- PR 494: get-benchmarks em cache
- PR 484: /api/public/get-status exibe respostas em cache
- Aceleração de 37x (de 37 s para 1 s) no tempo de carregamento de referências
Aceleração de 2,3x em APKs de compilação
colaboradores: jonahwilliams, blasten, zanderso e xster
- PR 44534: melhorar o desempenho do APK de compilação (aproximadamente 50%) ao executar gen_snapshot de maneira simultânea
- Aceleração de 2,3x (de 140 s para 60 s) na compilação de lançamento de um APK em plataformas direcionadas para android-arm, android-arm64 e android-x64
Mais de 103 métricas de desempenho registradas por confirmação do mecanismo Flutter
colaboradores: liyuqian, digiter, keyonghan, godofredoc e cbracken
- PR 14556: executar e coletar referências
- Problema relacionado: PR 37434: centralizar métricas de desempenho, fornecer alertas universais e melhorar o painel de desempenho
Redução de 20% no tamanho do aplicativo
colaboradores: mraleph, alexmarkov, rmacnak-google, mkustermann, sstrickl e aartbik
- 3%: retirar os deslocamentos de PC do StackMaps
- 2,58%: comprimir ainda mais as informações prévias no StackMaps
- 1%: canonizar as cargas úteis do CompressedStackMaps quando possível
- 2%: permitir a eliminação total de duplicação de instruções no modo simples
- 0,3%: não gerar um prólogo monomórfico para funções que precisam do descritor args
- 1%: eliminar armazenamentos de inicialização redundantes de null
- 6%: reduzir o alinhamento das instruções e remover algumas instruções de interceptação de depuração
- 1,2%: ajustar a CSP durante a invocação de stub em vez de cada prólogo da função
- 1%: ARM64: bloquear R22 para manter NullObject()
- 2,5%: propagação constante de todo o programa
- 0,77%: eliminação de código morto
Aceleração de 108x no desempenho do Dart FFI
colaboradores: dcharkes, mkustermann, sjindel e alexmarkov
- Gerrit 120661: otimizar operações do ponteiro para tipos estaticamente conhecidos
- Gerrit 119645: ponteiro otimizado com indexação de carga e armazenamento
- Gerrit 121580: permitir alinhamento de funções otimizadas de força em AoT
10 a 15% de melhoria no desempenho em código restrito
colaboradores: aartbik, mkustermann e mraleph
- Gerrit 117200: análise de loop e melhorias de BCE
- 10 a 15% de melhoria de desempenho no golem armv7 e no TypedData Bench: Gerrit 117200: análise de loop e melhorias de BCE
Aceleração de 2,2x no teste do Flutter com o novo serializador incremental
colaboradores: jensjoha e alexmarkov
- Gerrit 121121: ativar serializador incremental por padrão
- Aceleração de 2,2x (de 3:38 para 1:39) no “teste do Flutter”
Serialização binária do kernel 10% mais rápida, oferecendo dicas em linha ao JIT do Dart VM
colaboradores: jensjoha e johnniwinther
30% de melhoria no desempenho em código pesado assíncrono
colaboradores: cskau-g, mkustermann e mraleph
Outras melhorias
Correção de vazamento de memória ao usar PlatformView no iOS
- Corrigir vazamento de memória ao usar PlatformView [IOS]
- Vazamento de memória ao usar PlatformView [IOS]
Correção de um vazamento de memória durante a reprodução da animação no iOS
- Gerrit 260538: não alocar mensagens de invalidação para geradores que produzem texturas não rastreáveis
- Vazamento de memória durante a reprodução da animação no iOS
Mais correções de vazamento de memória no iOS
- https://github.com/flutter/engine/pull/14275
- https://github.com/flutter/engine/pull/14326
- https://github.com/flutter/flutter/issues/35243
Início da reformulação das páginas de desempenho no flutter.dev e inclusão de instruções sobre como medir o tamanho do aplicativo.
Correção da primeira lógica de espera e medição de frames
- PR 37192: retornar “Corrigir a lógica do primeiro frame no rastreamento e no driver (#35297)”
- Problema corrigido 47108: vazamento de memória durante a reprodução da animação no iOS
O DevTools adicionou o modo de linha do tempo completo com suporte para rastreamento assíncrono e gravado.
O plugin IntelliJ corrigiu o suporte para 120 FPS
Muitas melhorias no rastreamento da linha do tempo graças ao ByteDance
- Gerrit 127920: [linha do tempo] adicionar suporte para eventos assíncronos da linha do tempo no rastreamento da plataforma Android
- Gerrit 128200: [linha do tempo] suporte para eventos vm disponível no systrace
- Gerrit 127921: suporte para mais eventos de sincronização ao usar o systrace para gravar eventos da linha do tempo
- PR 14323: corrigir o stream da API ausente ao registrar o evento no systrace
- PR 14521: o suporte para linha do tempo pode ser ativado no modo de lançamento
- PR 14319: corrigir evento da linha do tempo ausente referente ao horário de inicialização do mecanismo do Flutter
- PR 47742: corrigir evento de duração do resumo da linha do tempo
- Gerrit 131360: suporte à conversão da linha do tempo para rastreamento da plataforma iOS
- PR 16520: suporte para buffer de rastreamento infinito
- PR 47419: suporte para gravador infinito na linha do tempo
Terceiro trimestre (de julho a setembro) de 2019
Melhorias em números
Aceleração de 1,5–5x para transformações rect e point
colaboradores: flar, yjbanov e dnfield
- PR 37275: otimizar os métodos transformRect e transformPoint em matrix_utils
- Aceleração de 5,3x (de 2.300 ms para 430 ms) em MatrixUtils_affine_transformRect_iteration
- Aceleração de 1,5x (de 466 ms para 320 ms) em MatrixUtils_affine_transformPoint_iteration
N/2–1 poucos frames perdidos na rolagem do iPhone X/Xs
colaboradores: liyuqian, chinmaygarde e gaaclarke
- https://github.com/flutter/engine/pull/12385
- PR 12385: retornar “Suavizar a entrega irregular de eventos de entrada do iOS
- Redução do pior número de frames perdidos de N/2 para 1 em uma rolagem de N frames. Na prática, N/10 frames foram perdidos em média antes da correção.
- Correção de um dos nossos problemas mais votados:
Problema 31086: desempenho de rolagem significativamente reduzido nos dispositivos iPhone X e XS devido à entrega irregular de eventos de entrada
15% mais rapidez na inicialização e no encerramento do mecanismo com a inicialização paralela
colaboradores: gaaclarke, chinmaygarde e liyuqian
- PR 10182: tornou a inicialização do Flutter mais rápida, permitindo o uso de um processo paralelizado
- Aceleração de 1,16x (de 3,829.377 ns para 3,286.713 ns) em BM_ShellInitializationAndShutdown
Inicialização 14,57 ms mais rápida e uso de memória 8 MB menor para aquecimento do sombreador
colaboradores: gaaclarke, liyuqian e dnfield
- PR 36482: acelerar o aquecimento do sombreador ao desenhar em uma superfície de 100 x 100
- Economiza 14,57 ms (de 18,848 ms para 4,279 ms) na leitura/conversão de pixels durante a inicialização
- Economiza 8 MB (de 39.220 KB para 31.184 KB) na memória da mediana inicial
- Economiza 4 MB (de 45.034 KB para 40.980 KB) na memória da mediana final
Redução de 1,02%-8,04% no tamanho do código
colaboradores: johnniwinther, aartbik, rmacnak-google, jensjoha, alexmarkov e mkustermann
- https://dart-review.googlesource.com/c/sdk/+/118280
- https://dart-review.googlesource.com/c/sdk/+/112758
- https://dart-review.googlesource.com/c/sdk/+/118181
- -8,04% (de 5,57 MB para 5,13 MB) em armv8 animation_bench_instructions_size
- -2,7% (de 2,10 MB para 2,05 MB) em armv7 flutter_gallery_readonlydata_size
- -1,22% (de 2,10 MB para 2,05 MB) em armv7 layout_bench_instructions_size
Aumento de até 2x na taxa de FPS do Fuchsia para o Flutter, com agendamento de frames aprimorado
colaboradores: dreveman, amott, rosswang e mikejurka
- https://fuchsia-review.googlesource.com/c/topaz/+/280230
- https://fuchsia-review.googlesource.com/c/topaz/+/286735
- https://fuchsia-review.googlesource.com/c/topaz/+/300135
- https://fuchsia-review.googlesource.com/c/topaz/+/306773
- https://fuchsia-review.googlesource.com/c/topaz/+/306772
- https://fuchsia-review.googlesource.com/c/topaz/+/307953
Correções de regressão em números
Aceleração de 3x para BackdropFilter no iOS
colaboradores: lhkbob, liyuqian e flar
- https://skia-review.googlesource.com/c/skia/+/237904
- https://skia-review.googlesource.com/c/skia/+/234413
- https://github.com/flutter/flutter/pull/38814
- Aceleração de 3x (de 110 ms para 34 ms) em GM_savelayer_with_backdrop
- Regressão corrigida https://github.com/flutter/flutter/issues/36064
Para alcançar altos níveis de melhoria (por exemplo, 3x), o mau desempenho do estado antigo provavelmente foi tão importante quanto o esforço realizado no terceiro trimestre (de julho a setembro) de 2019. Também marcamos algumas melhorias como correções significativas de regressões igualmente importantes. No entanto, somos muito gratos por essas contribuições. Sem elas, ainda teríamos resultados ruins em relação ao desempenho e às regressões. Nossa intenção não é desvalorizar as melhorias menores em detrimento das grandes. Apenas destacamos que não havia um desempenho muito ruim para ser melhorado, o que é também um bom sinal.
Outras melhorias
- DevTools oferece suporte a taxas de atualização de exibição variáveis (por exemplo, 60 FPS, 120 FPS etc.)
- A verificação de projetos do plug-in VSCode agora é assíncrona, o que deve melhorar a velocidade de ativação da extensão e reduzir as chances de acionar o aviso de "extensão causa alta CPU" do VSCode. (#1840/#2003/#1961)
- O iPhone XS é adicionado ao laboratório de dispositivos do Flutter para comparação com parâmetro de referência
Conclusão

Graças a essas contribuições da nossa comunidade, a proporção de usuários positivamente satisfeitos com o desempenho do Flutter em dispositivos móveis aumentou de 85% no terceiro trimestre de 2019 para 92% em 2020. Apesar do nosso esforço, talvez nem todas as contribuições de desempenho realizadas no terceiro e no quarto trimestres de 2019 tenham sido incluídas nesta atualização. Caso você não tenha encontrado alguma contribuição recente nesta publicação, avise nossa equipe para que possamos inclui-la na próxima atualização.
Um comentário :
Your explanation makes learning easy. PM Ehsaas Program 8171 Thank you!
Postar um comentário