SlideShare uma empresa Scribd logo
Dicas de otimização para
    aplicações Qt e QML.




1   Copyright 2012 Nokia
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
TÓPICOS
    • Porque performance é importante
    • Como melhorar a performance das suas aplicacões
    • Perguntas




3   Copyright 2012 Nokia
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
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
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
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
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
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
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
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
QVector vs QLinkedList vs
QList
     • QLinkedList
         Usada para grande quantitade de elementos
                   Tempo constante para inserções e remoções




12   Copyright 2012 Nokia
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
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
Qt implicit data sharing

     • Maximiza o reuso de objetos e minimiza a cópia




15   Copyright 2012 Nokia
Qt implicit data sharing

     • Objeto somente é copiado se for modificado




16   Copyright 2012 Nokia
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
Qt implicit data sharing

     • Exemplos:




                            QTransform não usa implicit data sharing




18   Copyright 2012 Nokia
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
Dicas de Otimização para QML




20   Copyright 2012 Nokia
Dividir e conquistar




21   Copyright 2012 Nokia
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
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
Load e Unload




24   Copyright 2012 Nokia
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
Load e Unload




26   Copyright 2012 Nokia
Otimizar o uso de Imagens




27   Copyright 2012 Nokia
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
Operações com Strings




29   Copyright 2012 Nokia
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
Dominar States, Transitions e
         Animations



31   Copyright 2012 Nokia
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
Seguir sempre as boas
           práticas de programação



33   Copyright 2012 Nokia
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
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
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
Perguntas?



Copyright 2012 Nokia
Obrigado!



Copyright 2012 Nokia

Mais conteúdo relacionado

Dicas de otimização para aplicações Qt

  • 1. Dicas de otimização para aplicações Qt e QML. 1 Copyright 2012 Nokia
  • 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
  • 20. Dicas de Otimização para QML 20 Copyright 2012 Nokia
  • 21. Dividir e conquistar 21 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
  • 24. Load e Unload 24 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
  • 26. Load e Unload 26 Copyright 2012 Nokia
  • 27. Otimizar o uso de Imagens 27 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
  • 29. Operações com Strings 29 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
  • 31. Dominar States, Transitions e Animations 31 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
  • 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