Mais conteúdo relacionado
Dicas de otimização para aplicações Qt
- 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
- 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
- 35. Links úteis
• QML Performance Monitor
http://www.youtube.com/watch?v=XdI9C53uJw8
• Valgrind
http://valgrind.org/docs/manual/mc-manual.html
• QML Performance Guidelines
http://doc.qt.nokia.com/4.7/qdeclarativeperformance
.html
• Qt Implicit Data Sharing
http://doc.qt.nokia.com/4.7-snapshot/implicit-
sharing.html
35 Copyright 2012 Nokia
- 36. Canais de
comunicação
• @nokiadev_brasil
• http://bit.ly/NokiaDev_Qt_Brasil
• http://blog.qtlabs.org.br/
• willer.moreira@openbossa.org
• willer.moreira@indt.org.br
36 Copyright 2012 Nokia