Un test montre que du code utilisant le Framework Qt est plus court
Plus lisible, et plus rapide à compiler et à exécuter. Votre expérience ?

Le , par dourouc05, Responsable Qt
Bonjour,

Qt est un framework de plus en plus utilisé. Cependant, à l'instar des frameworks PHP, il se pourrait que Qt ralentisse plus les applications développées que ce qu'il ne facilite le développement.

Hors André, sur les Qt Labs, nous a produit un petit benchmark : pour séparer une chaine en plusieurs autres, il a comparé une version utilisant la librairie standard, et une autre utilisant Qt.

Il en résulte que le code utilisant Qt est nettement plus court, plus lisible, plus rapide à compiler... et presque deux fois plus rapide !

I wanted to do a certain bit of benchmarking for quite a while - years actually - but triggered by one of those friendly discussions on the ##c++ channel on FreeNode I finally figured I should sit down and actually do it. I was expecting some interesting results, but the not at the scale that we will see below.

If you ask the resident channel bot on ##c++ how to tokenize a std::string you’ll get offered the following (slightly compacted) code snippet:
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
 
  #include <sstream> 
  #include <vector> 
  #include <string> 
 
  std::string str("abc:def"); 
  std::istringstream split(str); 
  std::vector<std ::string> tokens; 
  for (std::string each; std::getline(split, each, ':'); tokens.push_back(each));
Obviously, that’s the “Without Qt” version: Clean Standard C++, as straight-forward as it can get. The contender “With Qt” is:

Code : Sélectionner tout
1
2
3
4
5
  #include <QString> 
  #include <QStringList>  
 
  QString str("abc:def"); 
  QStringList tokens = str.split(':');
From the source alone we can collect a few numbers:
Property Without Qt With Qt Ratio
Code to type 3 lines 1 line 3.0
147 char 35 chars 4.2
Code usable as sub-expression no yes
Size of compilation unit [1] 22215 lines 7590 lines 2.9
Compile time [2] 1.64s 1.02s 1.6

To compare performance I use a benchmark that I just checked into the Qt source base, under tests/benchmark/qstringlist. It basically consists of running the above mentioned snippets on a string “unit:unit:unit:….” with 10, 100, 1000, and 10000 “unit” chunks and record callgrind’s “instruction loads per iteration” as follows:
Chunk count Without Qt With Qt Ratio
10 chunks 18,455 9,827 1.9
100 chunks 134,578 71,008 1.9
1000 chunks 1,244,425 641,174 1.9
10000 chunks 13,161,115 7,053,633 1.9

In this case, bigger numbers mean more time needed to execute. Interesting, isn’t it?

After reading Thiago’s latest posts I got the impression that people like conclusions. The verbose version of a conclusion might be something along the lines of

Using Qt’s functions to split a string you need about a third of the effort to write code, and get a 47% performance boost at runtime.

Or shorter (Qt way): “Code less, create more”.

André

[1] Counted with “g++ -E -DQT_NO_STL -I$QTDIR/include/QtCore -I$QTDIR/include qt.cpp | wc” using g++ Ubuntu 4.3.3-5ubuntu4.

[2] Fastest result of “real” time, out of 20 runs each. “user” times in both scenarios smaller, with similar ratio. Source


Et vous ?
Avez-vous l'impression qu'utiliser un framework tel que Qt peut ralentir, ou, au contraire, accélérer votre application ?
Avez-vous déjà effectué de tels tests ? Les résultats sont-ils aussi convaincants ?


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse

Avatar de ZeRevo ZeRevo - Membre averti http://www.developpez.com
le 27/08/2009 à 10:46
ne pouvait résoudre avec GTK+

C'est le genre d'annonce qui sert à rien vu qu'il n'y a pas d'arguments précis.
Avatar de superjaja superjaja - Rédacteur http://www.developpez.com
le 27/08/2009 à 10:59
Je crois que le sujet du débat change là...
Avatar de yan yan - Rédacteur http://www.developpez.com
le 27/08/2009 à 11:02
Citation Envoyé par ZeRevo  Voir le message
C'est le genre d'annonce qui sert à rien vu qu'il n'y a pas d'arguments précis.

j'avoue que c'est un peu trollesque cette partie
Toute façon un débat gtk vs Qt n'amènerais pas à grand chose. L'un est en C l'autre en C++.
A la limite gtkmm vs Qt, mais bon. Ces deux framework propose quasiment les même choses.
Avatar de Firwen Firwen - Membre expérimenté http://www.developpez.com
le 27/08/2009 à 12:00
j'avoue que c'est un peu trollesque cette partie
Toute façon un débat gtk vs Qt n'amènerais pas à grand chose. L'un est en C l'autre en C++.
A la limite gtkmm vs Qt, mais bon. Ces deux framework propose quasiment les même choses.

Surtout que les deux frameworks deviennent de plus en plus complémentaires.

Depuis le "phénomène Ubuntu", le nombre d'applications 100% Linux codé en Gtk+ augmentent : il y a des raisons à ça.... meilleur intégration au bureau GNOME, temps de démarrage raccourci, etc...

Parallèllement Qt devient un framework hors-pair pour faire du multi-plateforme en code natif : Linux, Windows, MAC OS X, S60, QNX , Linux embarqué, Windows CE, BSD......

longue vie à Qt, Longue vie à Gtk+
Avatar de Altess Altess - Membre habitué http://www.developpez.com
le 31/08/2009 à 9:25
il est clair que Qt est plutôt efficace. il propose des methodes utiles, et facilement exploitable. De plus, sa doc est plus que correcte. Ce sont ces petites choses qui rendent Qt plus clair, et plus lisible.

Coté performance, je n'ai jamais vraiment testé à vrai dire. Mais bon, comme souvent, ce benchmark ne veut pas dire grand chose. Tout dépend de ce que l'on souhaite codé.
Avatar de Nogane Nogane - Membre averti http://www.developpez.com
le 31/08/2009 à 13:05
Je n'utilise pas Qt mais je vais m'y mettre tôt ou tard. De ce que j'ai pu en voir, Qt et simple et puissant.

En revanche je regrette ce genre de comparaison entre Qt et la STL.
D'une par car Qt n'as pas a vouloir remplacer la STL. Parque ce n'est pas ce qu'on attend de lui, et aussi parque ce serai ce rendre totalement dépendent de Qt.

D'autre par, la fonction split n'existe pas dans la STL. Ce test ne peut donc pas prouver que la STL est moins clair ou plus lente, il prouve seulement que la STL ne contient pas autant d'outils que Qt. Ça c'est évident.

Une comparaison entre Qt et boost.tokenizer aurait été, a mon sens, bien plus intéressante.

Par example:
Code : Sélectionner tout
1
2
3
4
5
#include <QString> 
#include <QStringList>  
  
QString str("abc:def"); 
QStringList tokens = str.split(':');
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
#include <string> 
#include <vector> 
#include <boost/tokenizer.hpp> 
 
using namespace std; 
using namespace boost; 
 
string str("abc:def"); 
tokenizer<char_separator<char> > tok( 
  str,  
  char_separator<char>(":") ); 
vector<string> tokens(tok.begin(), tok.end());
Qu'est-ce qu'on peut y voir?
La version boost est plus complexe, pour plusieurs raison:
- boost est dans un namespace et j'ai choisit de faire des using namespace.
- On doit définir le séparateur, ce qui n'est pas a faire dans Qt vue qui n'y as pas 36 types de séparateurs.
- boost utilise une syntaxe STL-like ce qui fait qu'on peut utiliser tokenizer avec n'importe quel conteneur STL-like, c'est à dire même avec Qt(jusqu'as la version 3 car après ils ont abandonné les iterateurs STL-like). Le conteneur n'est pas imposé comme avec Qt.

Voila donc mon avis personnel sur cette exemple précis (comparaison Qt/STL/boost au niveau du split):
Qt est certainement plus clair et plus concis, ce qui est très bien dans certain cas.
La STL ne gère pas le split directement. La STL est assez ancienne certes, et c'est pourquoi il y a boost.
Boost gère très bien le split, mais de manière très modulable/paramétrable, c'est au pris de la clarté, comme toujours, mais c'est très bien aussi, dans d'autre cas.
Avatar de Niak74 Niak74 - Membre averti http://www.developpez.com
le 31/08/2009 à 14:53
Voté "Qt améliore la productivité et les performances".

Je bossais au début avec Java, je suis ensuite passé dans le monde du C++ avec Eclipse et WxWidget.

Depuis que je me suis mis à Qt, j'ai tous les avantages de Java pour ce qui est de la philosophie OO, et tous des avantages du C/C++ pour ce qui est des performances (Java n'est pas réputé pour sa rapidité). En plus de ça, je suis multiplateforme et j'ai des outils tout prêt pour la cross compilation (je développe pour appareil portables), que demander de plus?

Je commence à maitriser le Framework, et je dois avouer qu'on gagne énormément en temps de développement en utilisant les outils proposés par Qt. Ceux-ci ayant été optimisé, on y gagne en performances et en temps de debug (très spécialement en tout ce qui concerne malloc/free | new/delete).

Les principaux + :
- C/C++ = rapidité
- Framework riche (beaucoup de classes bien pensées et toute faites)
- GUI élégant
- Documentation très claire
- Outils puissants
- Un IDE spécialement conçu pour Qt (QtCreator)
Avatar de dourouc05 dourouc05 - Responsable Qt http://www.developpez.com
le 31/08/2009 à 18:01
Citation Envoyé par Niak74  Voir le message
Je bossais au début avec Java, je suis ensuite passé dans le monde du C++ avec Eclipse et WxWidget.

Depuis que je me suis mis à Qt, j'ai tous les avantages de Java pour ce qui est de la philosophie OO, et tous des avantages du C/C++ pour ce qui est des performances.


Qu'est-ce qui t'a fait changer de framework ? Qt correspondait-il mieux à ton passé de java-iste ?

Utiliser le C ou le C++ n'est pas forcément gage de rapidité. Si l'algorithme d'un code est mal fait, qu'il soit en Java ou en C, il sera lent. Un programme Java exploitant un bon algorithme sera plus rapide qu'un programme C++ avec un algorithme pondu en 5 secondes.
Avatar de Niak74 Niak74 - Membre averti http://www.developpez.com
le 31/08/2009 à 18:14
Ma boite souhaite développer des outils portables, à base de C/C++. Je me suis tourné d'abord vers WxWidget pour ce qui est du GUI puis j'ai découvert Qt. Mieux présenté, mieux documenté, en perpétuel développement, et proposant les outils qu'il me fallait pour aller plus vite (Traduction, Cross compilation, et émulateur virtuel de device (QVFb) notamment). C'est principalement les démos, vidéos, et nombreux tutos qui m'ont convaincu de faire le saut.

J'ai ensuite développé mon premier projet, il m'a fallut environ 3 fois moins de temps qu'avec WxWidgets (Installation, apprentissage du framework, développement, debug).

Pour ce qui est des performances, les anciens de ma boite s'accordent à penser que C/C++ est plus performant que Java, je leur fait confiance sur ce point. Question algorithme bien écrit, il faudrait interroger un expert Java et Qt pour avoir le comparatif, mes connaissances en Java n'étant pas assez poussées pour établir un tel test.
Avatar de dourouc05 dourouc05 - Responsable Qt http://www.developpez.com
le 31/08/2009 à 18:44
Citation Envoyé par Niak74  Voir le message
Pour ce qui est des performances, les anciens de ma boite s'accordent à penser que C/C++ est plus performant que Java, je leur fait confiance sur ce point. Question algorithme bien écrit, il faudrait interroger un expert Java et Qt pour avoir le comparatif, mes connaissances en Java n'étant pas assez poussées pour établir un tel test.


C++ est plus rapide que Java, parce qu'il est directement exécuté sur le processeur, les instructions ne doivent pas d'abord être converties pour le processeur (ce que font, en très gros, les machines virtuelles : JVM, .NET...). Voici ce qu'il fait qu'il est plus rapide, en général.

Maintenant, avant de se lancer dans l'optimisation du code, il faut se lancer dans l'optimisation de l'algorithme. Un bon algorithme, bien optimalisé, sera bien plus rapide qu'un algorithme bâclé. C'est en cela qu'un programme en Java peut être bien plus rapide qu'un programme en C++.
Avatar de Aurelien.Regat-Barrel Aurelien.Regat-Barrel - Expert éminent http://www.developpez.com
le 31/08/2009 à 19:03
Un aspect très important des performances / optimisation qui est souvent négligé concerne les structures de données / l'organisation mémoire. En particulier la manière d'allouer ses objets a un grand impact sur les performances. De ce côté là je trouve Qt assez pauvre (pas de pool d'allocation par exemple), même s'ils se distinguent avec leur utilisation du Copy On Write (ce qui limite les méfaits d'un code C++ maladroit un peu comme le garbage collector de Java optimise l'organisation mémoire des objets).
Offres d'emploi IT
Stagiaire en erp/crm
FM Media - Ile de France - Wissous (91320)
Développeur
Agence nationale de la sécurité des systèmes d'information ( - Ile de France - Paris (75000)
Développeur symfony confirmé h/f
altima - Nord Pas-de-Calais - Roubaix (59100)

Voir plus d'offres Voir la carte des offres IT
Contacter le responsable de la rubrique Accueil