Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Maîtrisez Qt
  3. Techniques d'optimisation
Extrait - Maîtrisez Qt Guide de développement d'applications professionnelles (3e édition)
Extraits du livre
Maîtrisez Qt Guide de développement d'applications professionnelles (3e édition)
1 avis
Revenir à la page d'achat du livre

Techniques d'optimisation

Objectifs

Les utilisateurs sont très exigeants avec les programmes qu’ils installent sur leur PC. Ils veulent qu’ils fonctionnent, ce qui ne pourrait leur être reproché, mais ils veulent qu’ils fonctionnent bien, ce dont on peut difficilement leur tenir rigueur. Pourtant beaucoup de développeurs ne comprennent pas les réactions des utilisateurs de leurs applications et leur reprochent un manque de souplesse ou de compréhension. C’est malheureusement bien le phénomène inverse qui se produit : les développeurs ne sont parfois pas assez à l’écoute des besoins de leurs utilisateurs et ne cherchent pas suffisamment à adapter leurs applications à ces besoins.

La seule façon, selon nous, de créer des applications dignes d’intérêt et durables est de considérer que l’application est au service de l’utilisateur et que le développeur est au service de l’application. Cet état d’esprit détermine toute la conception de l’application.

Par conséquent, outre des règles simples d’ergonomie, le développeur de l’application doit prendre en considération l’ensemble de son public. Le premier réflexe d’un développeur est de penser et tester son application pour lui-même. Or il est informaticien...

Langages et mode de pensée

Notre premier conseil, sans doute le plus utile, est d’apprendre sérieusement le langage que vous utilisez. Vous devez avant toute autre chose connaître et maîtriser le langage dans lequel vous développez votre application. C’est une chose bien plus importante que ce que vous pouvez imaginer. Le langage est à la base de tout et en particulier d’un framework comme Qt. Imaginez-vous communiquer de manière intelligible avec une personne très lettrée si vous maîtrisez partiellement le vocabulaire et très mal la sémantique ? Il en va de même avec C++ ou un autre langage, vous pouvez connaître par cœur la syntaxe du langage mais si vous n’en maîtrisez pas la sémantique, c’est-à-dire les enchaînements logiques entre les éléments de syntaxe et ce qui fait le sens de votre application, vous n’avancerez ni vite ni loin dans vos développements et buterez régulièrement sur des problèmes conceptuels.

Si vous utilisez Qt Quick, vous devrez en plus acquérir les connaissances suffisantes sur les langages QML et JavaScript.

Qu’est-ce qu’un langage informatique après tout ? Un jeu d’instructions, plus ou moins intelligibles, généralement en langue anglaise, qui vous permet d’écrire votre programme. Ce langage sera (peut-être) compilé ensuite pour être transformé dans une langue comprise par la machine. Et c’est tout ? Absolument pas. Un langage c’est surtout...

Notions de C++ indispensables

Ce chapitre constitue un bref rappel des connaissances indispensables pour exploiter correctement les capacités de Qt. Une connaissance approfondie de C++ et de ses mécanismes est fortement recommandée.

Qt est purement écrit en C++, contrairement à Cocoa sous OS X qui est programmé en Objective-C, dérivé du C, ou de MFC sous Windows qui est aussi en C. Il est donc uniquement constitué de bibliothèques de classes. Il est très comparable à Java/Swing sur ce point.

1. Pointeurs et références

Dans cette section, nous revenons rapidement sur les pointeurs C, leur complexité et leur fonctionnement. Notre objectif est de préparer le lecteur à l’introduction d’autres types de pointeurs, dits « intelligents » et de techniques permettant d’effectuer des copies d’objets optimisées pour la mémoire et le processeur.

a. Pointeurs C

Dans la machine, les variables sont des valeurs stockées en mémoire volatile RAM. Par exemple, lorsque vous déclarez une variable de type C char, un espace mémoire de la taille d’un octet est réservé en mémoire.

images/17_SC_01.png

Dans l’exemple ci-dessus nous avons défini une variable maVariable de type int dont l’adresse physique en mémoire est 0x335444 et un pointeur int* sur cette variable. Ce pointeur se situe à l’adresse 0x100332214 et contient l’adresse 0x335444, celle de maVariable.

int maVariable = 0x01FF4311 ;  
int* monPointeur = &maVariable ; 

Les pointeurs sont beaucoup utilisés pour éviter d’avoir à copier des données lorsqu’on passe des arguments à des fonctions, et pour pointer littéralement vers des structures d’objets composites telles que des struct, union ou encore des instances de classes. Les objets ne sont créés qu’une seule fois et jamais copiés, seuls les pointeurs sont copiés.

Ils permettent aussi de pointer vers des fonctions, permettant ainsi de passer ces fonctions comme arguments à d’autres fonctions, ce qui est indispensable dans le cas de la programmation asynchrone. Heureusement cette complexité est cachée par Qt.

Les pointeurs font souvent peur aux développeurs...

Optimisations

L’optimisation de votre application se joue à plusieurs niveaux :

  • La conception tout d’abord. Durant cette phase vous définissez les contours de votre application, ses interactions avec l’utilisateur et son modèle objet. Vous faites un premier travail de réflexion sur l’ergonomie tout en concevant les liens entre les IHM et votre modèle de données, liens qui peuvent devenir rapidement très complexes.

    Ne bâclez surtout pas cette phase, elle peut représenter jusqu’à 50 % du temps consacré au projet mais elle est cruciale. Si vous constatez que la complexité de votre interface graphique est trop importante, réduisez-la. Vous réduirez d’autant, sinon plus, la complexité de votre modèle objet. De même, si vous constatez que vous avez trop de contrôleurs, trop de couches entre votre modèle de données et vos IHM, réduisez-les.

    D’une manière générale, moins vous avez de classes et d’objets instanciés, moins vous aurez de difficulté à maintenir un bon niveau de performances et à faire évoluer votre application... sinon à la maintenir en état de fonctionnement. 

  • Le développement est aussi une phase où l’optimisation joue un rôle important. Lorsque vous codez, vous devez être suffisamment concentré pour éviter des erreurs grossières comme la déclaration de variables dans une boucle ou encore la copie multiple d’objets volumineux.

    Ceci vient surtout avec l’expérience, et la phase d’optimisation suivante représente une grande partie de votre gain d’expérience.

    Certains d’entre vous pensent que de toute façon le compilateur fait déjà une grande partie de ce travail. Ce qui est vrai, mais pas toujours, et pas forcément à bon escient, pas nécessairement sans conséquences sur votre programme, et pas de la même manière d’une plateforme à une autre et d’un compilateur à l’autre. C’est le cas des fonctions inline par exemple. Dans certains cas, vous devrez même désactiver complètement les optimisations du compilateur et les interdire parce qu’elles...

Quelques particularités de Qt

1. Types primitifs

Les personnes qui ont déjà développé en C du code multiplateforme se remémoreront aisément les tracas causés par les différents nommages des types primitifs en fonction des compilateurs et des plateformes. Dans un cas les entiers non signés sont nommés uint, dans un autre u_int, ou encore uint_t, etc. De plus, ces notations sont imprécises car le développeur ne connaît pas la taille réelle de l’entier sur l’architecture et ne peut donc pas effectuer des traitements sur des blocs mémoire de taille précise. Par conséquent, certains compilateurs possèdent une notation plus précise comme uint_32 pour les entiers non signés sur 4 octets, sur d’autres compilateurs cela sera uint32_t, et ainsi de suite.

Les types couramment utilisés dans C et C++ sont tous redéfinis selon une terminologie propre à Qt. Ainsi les différences entre plateformes, systèmes et processeurs sont gommées pour permettre au développeur de ne pas avoir à différencier son code pour chaque plateforme et architecture.

Par exemple, le type entier non signé sera noté quint32 dans Qt.

Les noms sont faciles à deviner et organisés comme suit :

q[u]int[taille] 
  • u : le type est non signé.

  • taille : 8, 16, 32 ou 64 (en bits).

Dans le but d’être compatible avec d’autres conventions auxquelles sont habitués certains développeurs, Qt définit encore d’autres types :

  • uchar équivaut à unsigned char.

  • ushort équivaut à unsigned short.

  • uint équivaut à unsigned int.

  • ulong équivaut à unsigned long.

Nous déconseillons cependant l’usage de ces types car ils manquent de précision dans la définition. En dehors de uchar et ushort qui sont toujours d’une taille de 8 et 16 bits respectivement, les types int et long ont une taille qui peut varier en fonction du système de 32 à 64 bits.

En cas de doute sur la définition d’un type, nous recommandons de consulter le fichier qglobal.h.

2. Gestion de la mémoire

Tant pour l’obtention de bonnes performances que pour l’optimisation de la consommation de la mémoire...

Lectures complémentaires

Voici une liste d’ouvrage que nous vous recommandons à la fois pour l’apprentissage du langage, pour sa maîtrise et la compréhension des mécanismes sous-jacents à la compilation.

  • Effective C++ - 55 specific ways to improve your programs and designs - Scott Meyers - Editions Addison-Wesley

    Cet ouvrage donne des explications documentées sur différents moyens d’améliorer la conception des applications en C++. Beaucoup sont spécifiquement adaptés à la STL, mais dans l’ensemble la lecture de cet ouvrage est très précieuse pour comprendre les mécanismes profonds de C++.

  • More effective C++ - 35 new ways to improve your programs - Scott Meyers - Editions Addison-Wesley

    Cet ouvrage est la suite du précédent et donne davantage d’explications et d’exemples actualisés sur les améliorations conceptuelles à apporter à vos programmes.

  • Effective Modern C++ - Scott Meyers - Editions O’Reilly.

  • Cet ouvrage présente, dans la continuité des deux précédents du même auteur, les techniques d’optimisation propres à C++-11 et C++-14.

  • Programming in Objective-C - A complete introduction to the Objective-C language - Stephen G. Kochan - Editions Developer’s library

  • Pour mieux développer avec C++ : Design patterns, STL, RTTI...