SlideShare uma empresa Scribd logo
1 de 38
Baixar para ler offline
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

Destaque

Qt Techday - João Pessoa
Qt Techday - João PessoaQt Techday - João Pessoa
Qt Techday - João PessoaOpenBossa
 
Algoritmo de Smith-Waterman
Algoritmo de Smith-WatermanAlgoritmo de Smith-Waterman
Algoritmo de Smith-WatermanMarcos Castro
 
Desenvolvimento orientado a objetos com C++ e QT4 - Henrique Marks
Desenvolvimento orientado a objetos com C++ e QT4 - Henrique MarksDesenvolvimento orientado a objetos com C++ e QT4 - Henrique Marks
Desenvolvimento orientado a objetos com C++ e QT4 - Henrique MarksTchelinux
 
Listas, tuplas, conjuntos e dicionários
Listas, tuplas, conjuntos e dicionáriosListas, tuplas, conjuntos e dicionários
Listas, tuplas, conjuntos e dicionáriosMarcos Castro
 
Problema do Caixeiro Viajante
Problema do Caixeiro ViajanteProblema do Caixeiro Viajante
Problema do Caixeiro ViajanteMarcos Castro
 
Programação dinâmica
Programação dinâmicaProgramação dinâmica
Programação dinâmicaMarcos Castro
 
Análise Assintótica
Análise AssintóticaAnálise Assintótica
Análise AssintóticaMarcos Castro
 
Busca em largura - BFS
Busca em largura - BFSBusca em largura - BFS
Busca em largura - BFSMarcos Castro
 
Algoritmo de Kosaraju
Algoritmo de KosarajuAlgoritmo de Kosaraju
Algoritmo de KosarajuMarcos Castro
 
Maratona de Programação com STL
Maratona de Programação com STLMaratona de Programação com STL
Maratona de Programação com STLMarcos Castro
 
Backtracking - Gerar todos os subconjuntos
Backtracking - Gerar todos os subconjuntosBacktracking - Gerar todos os subconjuntos
Backtracking - Gerar todos os subconjuntosMarcos Castro
 
Mágica com qt’s meta object system
Mágica com qt’s meta object systemMágica com qt’s meta object system
Mágica com qt’s meta object systemRodrigo Delduca
 
Construção de interfaces gráficas com Tkinter
Construção de interfaces gráficas com TkinterConstrução de interfaces gráficas com Tkinter
Construção de interfaces gráficas com TkinterMarcos Castro
 
Árvores de Decisão
Árvores de DecisãoÁrvores de Decisão
Árvores de DecisãoMarcos Castro
 
Metaheurística Simulated Annealing
Metaheurística Simulated AnnealingMetaheurística Simulated Annealing
Metaheurística Simulated AnnealingMarcos Castro
 

Destaque (20)

Qt Techday - João Pessoa
Qt Techday - João PessoaQt Techday - João Pessoa
Qt Techday - João Pessoa
 
Big data, e eu com isso?
Big data, e eu com isso?Big data, e eu com isso?
Big data, e eu com isso?
 
Algoritmo de Smith-Waterman
Algoritmo de Smith-WatermanAlgoritmo de Smith-Waterman
Algoritmo de Smith-Waterman
 
Desenvolvimento orientado a objetos com C++ e QT4 - Henrique Marks
Desenvolvimento orientado a objetos com C++ e QT4 - Henrique MarksDesenvolvimento orientado a objetos com C++ e QT4 - Henrique Marks
Desenvolvimento orientado a objetos com C++ e QT4 - Henrique Marks
 
PySide
PySidePySide
PySide
 
Arquivos FASTQ
Arquivos FASTQArquivos FASTQ
Arquivos FASTQ
 
Listas, tuplas, conjuntos e dicionários
Listas, tuplas, conjuntos e dicionáriosListas, tuplas, conjuntos e dicionários
Listas, tuplas, conjuntos e dicionários
 
Problema do Caixeiro Viajante
Problema do Caixeiro ViajanteProblema do Caixeiro Viajante
Problema do Caixeiro Viajante
 
Algoritmos gulosos
Algoritmos gulososAlgoritmos gulosos
Algoritmos gulosos
 
Programação dinâmica
Programação dinâmicaProgramação dinâmica
Programação dinâmica
 
Análise Assintótica
Análise AssintóticaAnálise Assintótica
Análise Assintótica
 
Busca em largura - BFS
Busca em largura - BFSBusca em largura - BFS
Busca em largura - BFS
 
Algoritmo de Kosaraju
Algoritmo de KosarajuAlgoritmo de Kosaraju
Algoritmo de Kosaraju
 
Maratona de Programação com STL
Maratona de Programação com STLMaratona de Programação com STL
Maratona de Programação com STL
 
Backtracking - Gerar todos os subconjuntos
Backtracking - Gerar todos os subconjuntosBacktracking - Gerar todos os subconjuntos
Backtracking - Gerar todos os subconjuntos
 
Mágica com qt’s meta object system
Mágica com qt’s meta object systemMágica com qt’s meta object system
Mágica com qt’s meta object system
 
Construção de interfaces gráficas com Tkinter
Construção de interfaces gráficas com TkinterConstrução de interfaces gráficas com Tkinter
Construção de interfaces gráficas com Tkinter
 
Árvores de Decisão
Árvores de DecisãoÁrvores de Decisão
Árvores de Decisão
 
Metaheurística Simulated Annealing
Metaheurística Simulated AnnealingMetaheurística Simulated Annealing
Metaheurística Simulated Annealing
 
Apostila ferramentas QT
Apostila ferramentas QTApostila ferramentas QT
Apostila ferramentas QT
 

Semelhante a Qt e QML Performance

Integração Contínua com Hudson
Integração Contínua com HudsonIntegração Contínua com Hudson
Integração Contínua com HudsonLuis Reis
 
Developer Experience no Nubank
Developer Experience no NubankDeveloper Experience no Nubank
Developer Experience no NubankLetticia Nicoli
 
Arquitetura de Microservicos
Arquitetura de MicroservicosArquitetura de Microservicos
Arquitetura de MicroservicosNorberto Enomoto
 
Como automatizar Sistemas Legados utilizando ferramentas de DevOps
Como automatizar Sistemas Legados utilizando ferramentas de DevOpsComo automatizar Sistemas Legados utilizando ferramentas de DevOps
Como automatizar Sistemas Legados utilizando ferramentas de DevOpsRafael Salerno de Oliveira
 
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App | TDC Connections 2021
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App | TDC Connections 2021Boas Práticas em Aplicações na Nuvem: Twelve-Factor App | TDC Connections 2021
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App | TDC Connections 2021Renato Groffe
 
Apresentação GT - Digital Preservation
Apresentação GT - Digital PreservationApresentação GT - Digital Preservation
Apresentação GT - Digital PreservationRoberto Beraldo Chaiben
 
[Unirede] Webinar: Transportando as aplicações entre vários ambientes com Docker
[Unirede] Webinar: Transportando as aplicações entre vários ambientes com Docker[Unirede] Webinar: Transportando as aplicações entre vários ambientes com Docker
[Unirede] Webinar: Transportando as aplicações entre vários ambientes com DockerAécio Pires
 
Docker: Uso no dia a dia de desenvolvimento
Docker: Uso no dia a dia de desenvolvimentoDocker: Uso no dia a dia de desenvolvimento
Docker: Uso no dia a dia de desenvolvimentoMarcela Carvalho
 
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App - Março-2021
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App - Março-2021Boas Práticas em Aplicações na Nuvem: Twelve-Factor App - Março-2021
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App - Março-2021Renato Groffe
 
Kubecon EU 2019 Remarks
Kubecon EU 2019 RemarksKubecon EU 2019 Remarks
Kubecon EU 2019 RemarksRicardo Katz
 
Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...
Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...
Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...Renato Groff
 
Introdução aos sistemas operacionais embarcados
Introdução aos sistemas operacionais embarcadosIntrodução aos sistemas operacionais embarcados
Introdução aos sistemas operacionais embarcadosRodrigo Almeida
 
Microservices em Python: desafios e soluções
Microservices em Python: desafios e soluçõesMicroservices em Python: desafios e soluções
Microservices em Python: desafios e soluçõesGuilherme Vierno
 
DataLakers 2018 Qmeeting - São Paulo
DataLakers 2018 Qmeeting - São PauloDataLakers 2018 Qmeeting - São Paulo
DataLakers 2018 Qmeeting - São PauloEduardo Hahn
 
TDC2016SP - Trilha Quebrando um monolítico J2EE, uma história de trás das tri...
TDC2016SP - Trilha Quebrando um monolítico J2EE, uma história de trás das tri...TDC2016SP - Trilha Quebrando um monolítico J2EE, uma história de trás das tri...
TDC2016SP - Trilha Quebrando um monolítico J2EE, uma história de trás das tri...tdc-globalcode
 
Beers & Bytes - O Futuro da virtualização
Beers & Bytes - O Futuro da virtualizaçãoBeers & Bytes - O Futuro da virtualização
Beers & Bytes - O Futuro da virtualizaçãoCarlos Smaniotto
 
Seguranca - docker
Seguranca - dockerSeguranca - docker
Seguranca - dockerStefani Lima
 
Kubernetes de ponta a ponta: do Pod ao Deployment Automatizado - Janeiro-2020
Kubernetes de ponta a ponta: do Pod ao Deployment Automatizado - Janeiro-2020Kubernetes de ponta a ponta: do Pod ao Deployment Automatizado - Janeiro-2020
Kubernetes de ponta a ponta: do Pod ao Deployment Automatizado - Janeiro-2020Renato Groff
 

Semelhante a Qt e QML Performance (20)

Integração Contínua com Hudson
Integração Contínua com HudsonIntegração Contínua com Hudson
Integração Contínua com Hudson
 
Developer Experience no Nubank
Developer Experience no NubankDeveloper Experience no Nubank
Developer Experience no Nubank
 
Arquitetura de Microservicos
Arquitetura de MicroservicosArquitetura de Microservicos
Arquitetura de Microservicos
 
Como automatizar Sistemas Legados utilizando ferramentas de DevOps
Como automatizar Sistemas Legados utilizando ferramentas de DevOpsComo automatizar Sistemas Legados utilizando ferramentas de DevOps
Como automatizar Sistemas Legados utilizando ferramentas de DevOps
 
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App | TDC Connections 2021
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App | TDC Connections 2021Boas Práticas em Aplicações na Nuvem: Twelve-Factor App | TDC Connections 2021
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App | TDC Connections 2021
 
Apresentação GT - Digital Preservation
Apresentação GT - Digital PreservationApresentação GT - Digital Preservation
Apresentação GT - Digital Preservation
 
[Unirede] Webinar: Transportando as aplicações entre vários ambientes com Docker
[Unirede] Webinar: Transportando as aplicações entre vários ambientes com Docker[Unirede] Webinar: Transportando as aplicações entre vários ambientes com Docker
[Unirede] Webinar: Transportando as aplicações entre vários ambientes com Docker
 
Docker: Uso no dia a dia de desenvolvimento
Docker: Uso no dia a dia de desenvolvimentoDocker: Uso no dia a dia de desenvolvimento
Docker: Uso no dia a dia de desenvolvimento
 
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App - Março-2021
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App - Março-2021Boas Práticas em Aplicações na Nuvem: Twelve-Factor App - Março-2021
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App - Março-2021
 
Kubecon EU 2019 Remarks
Kubecon EU 2019 RemarksKubecon EU 2019 Remarks
Kubecon EU 2019 Remarks
 
Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...
Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...
Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...
 
Introdução aos sistemas operacionais embarcados
Introdução aos sistemas operacionais embarcadosIntrodução aos sistemas operacionais embarcados
Introdução aos sistemas operacionais embarcados
 
Microservices em Python: desafios e soluções
Microservices em Python: desafios e soluçõesMicroservices em Python: desafios e soluções
Microservices em Python: desafios e soluções
 
Dev vs. Ops
Dev vs. OpsDev vs. Ops
Dev vs. Ops
 
DataLakers 2018 Qmeeting - São Paulo
DataLakers 2018 Qmeeting - São PauloDataLakers 2018 Qmeeting - São Paulo
DataLakers 2018 Qmeeting - São Paulo
 
Datalakers 2018 Qmeeting
Datalakers 2018 QmeetingDatalakers 2018 Qmeeting
Datalakers 2018 Qmeeting
 
TDC2016SP - Trilha Quebrando um monolítico J2EE, uma história de trás das tri...
TDC2016SP - Trilha Quebrando um monolítico J2EE, uma história de trás das tri...TDC2016SP - Trilha Quebrando um monolítico J2EE, uma história de trás das tri...
TDC2016SP - Trilha Quebrando um monolítico J2EE, uma história de trás das tri...
 
Beers & Bytes - O Futuro da virtualização
Beers & Bytes - O Futuro da virtualizaçãoBeers & Bytes - O Futuro da virtualização
Beers & Bytes - O Futuro da virtualização
 
Seguranca - docker
Seguranca - dockerSeguranca - docker
Seguranca - docker
 
Kubernetes de ponta a ponta: do Pod ao Deployment Automatizado - Janeiro-2020
Kubernetes de ponta a ponta: do Pod ao Deployment Automatizado - Janeiro-2020Kubernetes de ponta a ponta: do Pod ao Deployment Automatizado - Janeiro-2020
Kubernetes de ponta a ponta: do Pod ao Deployment Automatizado - Janeiro-2020
 

Mais de Microsoft Mobile Developer

Intro to Nokia X software platform 2.0 and tools
Intro to Nokia X software platform 2.0 and toolsIntro to Nokia X software platform 2.0 and tools
Intro to Nokia X software platform 2.0 and toolsMicrosoft Mobile Developer
 
Location based services for Nokia X and Nokia Asha using Geo2tag
Location based services for Nokia X and Nokia Asha using Geo2tagLocation based services for Nokia X and Nokia Asha using Geo2tag
Location based services for Nokia X and Nokia Asha using Geo2tagMicrosoft Mobile Developer
 
Lumia App Labs: Lessons learned from 50 windows phone 8 design consultations
Lumia App Labs: Lessons learned from 50 windows phone 8 design consultationsLumia App Labs: Lessons learned from 50 windows phone 8 design consultations
Lumia App Labs: Lessons learned from 50 windows phone 8 design consultationsMicrosoft Mobile Developer
 
Windows Phone 8 speech: parliamo con la nostra app
Windows Phone 8 speech: parliamo con la nostra appWindows Phone 8 speech: parliamo con la nostra app
Windows Phone 8 speech: parliamo con la nostra appMicrosoft Mobile Developer
 
La pubblicazione di un'applicazione sullo store
La pubblicazione di un'applicazione sullo storeLa pubblicazione di un'applicazione sullo store
La pubblicazione di un'applicazione sullo storeMicrosoft Mobile Developer
 
Il pattern mvvm come strutturare al meglio il vostro progetto
Il pattern mvvm come strutturare al meglio il vostro progettoIl pattern mvvm come strutturare al meglio il vostro progetto
Il pattern mvvm come strutturare al meglio il vostro progettoMicrosoft Mobile Developer
 

Mais de Microsoft Mobile Developer (20)

Intro to Nokia X software platform 2.0 and tools
Intro to Nokia X software platform 2.0 and toolsIntro to Nokia X software platform 2.0 and tools
Intro to Nokia X software platform 2.0 and tools
 
Lumia App Labs: Lumia SensorCore SDK beta
Lumia App Labs: Lumia SensorCore SDK betaLumia App Labs: Lumia SensorCore SDK beta
Lumia App Labs: Lumia SensorCore SDK beta
 
Nokia Asha from idea to app - Imaging
Nokia Asha from idea to app - ImagingNokia Asha from idea to app - Imaging
Nokia Asha from idea to app - Imaging
 
Healthcare apps for Nokia X and Nokia Asha
Healthcare apps for Nokia X and Nokia AshaHealthcare apps for Nokia X and Nokia Asha
Healthcare apps for Nokia X and Nokia Asha
 
Push notifications on Nokia X
Push notifications on Nokia XPush notifications on Nokia X
Push notifications on Nokia X
 
DIY Nokia Asha app usability studies
DIY Nokia Asha app usability studiesDIY Nokia Asha app usability studies
DIY Nokia Asha app usability studies
 
Lessons learned from Nokia X UI reviews
Lessons learned from Nokia X UI reviewsLessons learned from Nokia X UI reviews
Lessons learned from Nokia X UI reviews
 
Location based services for Nokia X and Nokia Asha using Geo2tag
Location based services for Nokia X and Nokia Asha using Geo2tagLocation based services for Nokia X and Nokia Asha using Geo2tag
Location based services for Nokia X and Nokia Asha using Geo2tag
 
HERE Maps for the Nokia X platform
HERE Maps for the Nokia X platformHERE Maps for the Nokia X platform
HERE Maps for the Nokia X platform
 
Nokia In-App Payment - UX considerations
Nokia In-App Payment - UX considerationsNokia In-App Payment - UX considerations
Nokia In-App Payment - UX considerations
 
Introduction to Nokia Asha SDK 1.2 (beta)
Introduction to Nokia Asha SDK 1.2 (beta)Introduction to Nokia Asha SDK 1.2 (beta)
Introduction to Nokia Asha SDK 1.2 (beta)
 
UX considerations when porting to Nokia X
UX considerations when porting to Nokia XUX considerations when porting to Nokia X
UX considerations when porting to Nokia X
 
Kids' games and educational app design
Kids' games and educational app designKids' games and educational app design
Kids' games and educational app design
 
Nokia X: opportunities for developers
Nokia X: opportunities for developersNokia X: opportunities for developers
Nokia X: opportunities for developers
 
Lumia App Labs: Nokia Imaging SDK 1.1
Lumia App Labs: Nokia Imaging SDK 1.1Lumia App Labs: Nokia Imaging SDK 1.1
Lumia App Labs: Nokia Imaging SDK 1.1
 
Intro to Nokia X software platform and tools
Intro to Nokia X software platform and toolsIntro to Nokia X software platform and tools
Intro to Nokia X software platform and tools
 
Lumia App Labs: Lessons learned from 50 windows phone 8 design consultations
Lumia App Labs: Lessons learned from 50 windows phone 8 design consultationsLumia App Labs: Lessons learned from 50 windows phone 8 design consultations
Lumia App Labs: Lessons learned from 50 windows phone 8 design consultations
 
Windows Phone 8 speech: parliamo con la nostra app
Windows Phone 8 speech: parliamo con la nostra appWindows Phone 8 speech: parliamo con la nostra app
Windows Phone 8 speech: parliamo con la nostra app
 
La pubblicazione di un'applicazione sullo store
La pubblicazione di un'applicazione sullo storeLa pubblicazione di un'applicazione sullo store
La pubblicazione di un'applicazione sullo store
 
Il pattern mvvm come strutturare al meglio il vostro progetto
Il pattern mvvm come strutturare al meglio il vostro progettoIl pattern mvvm come strutturare al meglio il vostro progetto
Il pattern mvvm come strutturare al meglio il vostro progetto
 

Qt e QML Performance

  • 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