Este documento fornece dicas para melhorar o desempenho de aplicações Qt e QML, identificando e resolvendo gargalos de desempenho usando a Teoria das Restrições. Ele discute técnicas como dividir a interface em arquivos separados, carregar componentes dinamicamente, otimizar o uso de imagens e strings, e seguir boas práticas de programação.
2. Introdução
• Willer Moreira
Bacharel em Ciência da Computação - UFAM
Desenvolvedor de Software no INdT desde 2006
Projeto PySide
Desenvolve aplicações Qt/QML
2 Copyright 2012 Nokia
3. TÓPICOS
• Porque performance é importante
• Como melhorar a performance das suas aplicacões
• Perguntas
3 Copyright 2012 Nokia
4. Porque performance é
importante
• É atrativo para o usuário
• Deixa sua aplicação com um aspecto mais profissional
• O processo de desenvolvimento da sua aplicação fica
mais eficiente
• Interfaces dinâmicas
4 Copyright 2012 Nokia
5. Porque performance é
importante
• Qt Everywhere
Desktop
Plataformas embarcadas com recursos limitados
• Nem todas as aplicações podem tirar vantagem do uso
de múltiplos cores
5 Copyright 2012 Nokia
6. Como melhorar a performance
• TOC - Theory of Constraints (ou Teoria das Restrições)
• Esta teoria é baseada na idéia de que em qualquer
sistema complexo, existe pelo menos uma restrição
que limita sua habilidade de alcançar o seu objetivo ou
funcionamento pleno. Para alcançar as melhorias
nesse sistema essa restrição deve ser identificada e
resolvida.
6 Copyright 2012 Nokia
7. Teoria das restrições
• Defina uma meta?:
Por exemplo: Esta aplicação deve rodar em 30 FPS
• E então:
(1) Identifique o gargalo (restrição)
(2) Decida como explorar esse gargalo
(3) Faça as melhorias necessárias
(4) Se a meta não foi alcançada, volte para (1)
Pronto!
7 Copyright 2012 Nokia
8. Identificando o gargalo
• A melhor forma de identificar o gargalo:
Ferramentas de profiling
− Shark (Mac OS X)
− Valgrind (X11)
− Visual Studio Profiler (Windows)
− QML Performance Monitor
• Obs: Sempre faça as medições no modo release.
8 Copyright 2012 Nokia
9. Identificando o gargalo
• Quando o gargalo é identificado:
Verifique se a implementação usada é a melhor a
ser usada para essa tarefa
• Uma vez que a melhor implementação foi escolhida,
você pode explorar esse gargalo
Design
Código fonte
Compilação
9 Copyright 2012 Nokia
10. Explorar o gargalo
• Dicas gerais:
Cache
Atrasar um processamento até que ele seja
realmente necessário
Otimizações de compilação
• Técnicas de Otimização para o Qt
Escolher sempre o Container correto
− QVector vs QLinkedList vs QList
Usar “implicit data sharing” de forma eficiente
10 Copyright 2012 Nokia
11. QVector vs QLinkedList vs
QList
• QVector
Itens são armazenados continuamente na memória
Somente um bloco de memória é alocado
Inserções no inicio e no meio são lentas
11 Copyright 2012 Nokia
12. QVector vs QLinkedList vs
QList
• QLinkedList
Usada para grande quantitade de elementos
Tempo constante para inserções e remoções
12 Copyright 2012 Nokia
13. QVector vs QLinkedList vs
QList
• QList
De longe é o container mais usado
Gera menos código para o executável
Aloca espaço no inicio e no fim da estrutura
13 Copyright 2012 Nokia
14. QVector vs QLinkedList vs
QList
• QList é mais fácil de usar e gera menos código
• Na maioria dos caso, QList é a ideal para se usar.
• Se você só faz append(), use QVector
• Se você deseja tempos constantes de inserção e
remoção no meio do array, use QLinkedList
14 Copyright 2012 Nokia
15. Qt implicit data sharing
• Maximiza o reuso de objetos e minimiza a cópia
15 Copyright 2012 Nokia
16. Qt implicit data sharing
• Objeto somente é copiado se for modificado
16 Copyright 2012 Nokia
17. Qt implicit data sharing
• Como evitar deep-copy:
Use somente operadores e funções const se
possível
Use o foreach com moderação
Passar objectos como const sempre é um bom
hábito, mesmo quando estiver trabalhando com
classes que não usam implicit data sharing
Exemplos?
17 Copyright 2012 Nokia
18. Qt implicit data sharing
• Exemplos:
QTransform não usa implicit data sharing
18 Copyright 2012 Nokia
19. Qt implicit data sharing
• Acessem o documento “Implicitly Shared Classes” para
ver a lista completa de classes que usam implicit data
sharing no Qt
• http://doc.qt.nokia.com/4.7-snapshot/implicit-
sharing.html
19 Copyright 2012 Nokia
22. Dividir e conquistar
• Dividir a interface da aplicação em múltiplos arquivos
QML
• Cada entidade lógica será um arquivo QML
• Pensar em um modo Orientado a Objetos
• Não usar um arquivo QML gigante
22 Copyright 2012 Nokia
23. Dividir e conquistar
• Usar o arquivo main.qml como a interface principal
Com diferentes states e transitions
Criar múltiplas views (.qml)
Importar diretórios contendo outros arquivos .qml
23 Copyright 2012 Nokia
25. Load e Unload
• Usar o Loader para controlar o consumo de memória
• Carregar somente o mínimo possível no inicio
• Dinamicamente carregar e liberar componentes de UI
• Criar componentes novos quando necessário
25 Copyright 2012 Nokia
28. Otimizar o uso de Imagens
• Diminuir o consumo de memória
• Especificar o tamanho exato da imagem
• Evitar fazer resize/scaling de imagens no QML
• Usar a propriedade smooth com moderação
• Carregar imagens grandes em background
(asynchronous=true)
• Não fazer cache de imagens muito grandes
(cache=false)
28 Copyright 2012 Nokia
30. Operações com Strings
• Uso exagerado do operador '+' resulta em múltiplas
alcocações de memória
• Usar StringBuilder sempre que possível
• Definir
#define QT_USE_FAST_CONCATENATION
#define QT_USE_FAST_OPERATOR_PLUS
30 Copyright 2012 Nokia
32. States, Transitions e
Animations
• Em um Transition, a área animada deve ser pequena
• Animar diferentes itens sequencialmente sempre que
possível
• Evitar usar muitos Timers durante animações
• Evitar fazer operações com JavaScript durante as
animações
• Usar ScriptAction e StateChandeScript
32 Copyright 2012 Nokia
33. Seguir sempre as boas
práticas de programação
33 Copyright 2012 Nokia
34. Boas práticas
• Para melhor performance use C++ e não JavaScript
• Inserir propriedades sempre no topo das declarações
de elementos
• Criar a lógica da aplicação fora do QML
• Não sobrepor muitas camadas de elementos QML
• Usar Qt i18n para internacionalização
34 Copyright 2012 Nokia