Précédent   Forum des professionnels en informatique > C et C++ > Bibliothèques > Qt
Qt Forum d'entraide technique sur la bibliothèque Qt. Avant de poster -> F.A.Q Qt
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/02/2012, 19h37   #1
Nouveau Membre du Club
 
Avatar de alpha_one_x86
 
Étudiant
Inscription : décembre 2006
Messages : 305
Détails du profil
Informations personnelles :
Localisation : France, Somme (Picardie)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2006
Messages : 305
Points : 34
Points : 34
Envoyer un message via ICQ à alpha_one_x86 Envoyer un message via MSN à alpha_one_x86
Par défaut QList vs List de STL

Bonjour, j'ai des gros probléme de performance sur les QList, ça me prends 80% de mon temps cpu sur les QList::at() ou operator[].
J'aimerai donc passé sur les list de la STL pour gagner en performance. Quelqu'un as déjà fait des testes sur le sujet?
Je fait des .at(), insertion en fin de list, size, et clear.

Merci d'avance.
alpha_one_x86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 21h05   #2
Responsable Qt & Web sémantique

 
Avatar de dourouc05
 
Homme Thibaut Cuvelier
Étudiant
Inscription : août 2008
Messages : 16 333
Détails du profil
Informations personnelles :
Nom : Homme Thibaut Cuvelier
Localisation : Belgique

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : août 2008
Messages : 16 333
Points : 49 941
Points : 49 941
Envoyer un message via MSN à dourouc05 Envoyer un message via Yahoo à dourouc05


Les conteneurs Qt sont déjà pas mal optimisés, en général, bien que ce ne soit pas l'objectif premier. Les utilises-tu bien ? Tu forces peut-être la copie avec l'appel à at(), ce qui ralentirait déjà pas mal (principe du COW).
__________________
Le troisième défi Qt !

Vous souhaitez participer aux rubriques Qt ou PyQt/PySide (tutoriels, FAQ, traductions, sources) ? Contactez-moi par MP.

Qt : La FAQ : 200 QR
symfony : sfDoctrineGuard

Pas de question d'ordre technique par MP !
dourouc05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 21h41   #3
Nouveau Membre du Club
 
Avatar de alpha_one_x86
 
Étudiant
Inscription : décembre 2006
Messages : 305
Détails du profil
Informations personnelles :
Localisation : France, Somme (Picardie)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2006
Messages : 305
Points : 34
Points : 34
Envoyer un message via ICQ à alpha_one_x86 Envoyer un message via MSN à alpha_one_x86
Code: http://pastebin.com/y58rgEi6
Ligne 390, et surtout 460, c'est la ou les profiler me dise que c'est long.
Ensuite l'operateur[] semble appeller at() de QDataList ...

Je sais pas pourquoi, j'ai eu une grosse perte de performance de l'ordre de 1000 d'un coup.
alpha_one_x86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 22h01   #4
Nouveau Membre du Club
 
Inscription : juillet 2009
Messages : 49
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 49
Points : 36
Points : 36
La fonction at, il me semble vérifie à chaque fois si l'indice est correct.

Si vous utilisez QList avec l'opérateur [], vous pouvez donc utiliser un QVector.
Vous pouvez s'il vous voulez éviter les appels de fonction faire une énumération rapide du style
Code :
1
2
3
4
5
6
 
 
T * ptr = (myVector.count() ? myVector.data() : 0);
for(int i = 0, end = myVector.count(); i < end; ++i){
     ....
}
nosleduc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 22h12   #5
Nouveau Membre du Club
 
Avatar de alpha_one_x86
 
Étudiant
Inscription : décembre 2006
Messages : 305
Détails du profil
Informations personnelles :
Localisation : France, Somme (Picardie)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2006
Messages : 305
Points : 34
Points : 34
Envoyer un message via ICQ à alpha_one_x86 Envoyer un message via MSN à alpha_one_x86
Qt semble en interne beaucoup faire appelle à la glibc (un maj ne change rien), 80% de l'appelle à [] ou at est dans mcount et _mcount_internal de libc (packet glibc ici), libc-2.14.1.so _mcount.S et mount.c
alpha_one_x86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 22h26   #6
Nouveau Membre du Club
 
Inscription : juillet 2009
Messages : 49
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 49
Points : 36
Points : 36
ptr est donc un tableau, l'accès avec [] doit être plus rapide
nosleduc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 23h29   #7
Nouveau Membre du Club
 
Avatar de alpha_one_x86
 
Étudiant
Inscription : décembre 2006
Messages : 305
Détails du profil
Informations personnelles :
Localisation : France, Somme (Picardie)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2006
Messages : 305
Points : 34
Points : 34
Envoyer un message via ICQ à alpha_one_x86 Envoyer un message via MSN à alpha_one_x86
Je ne sais pas comment rajouté rapidement un entrée à la fin d'un tableau de pointeur (faut l'élargir dynamiquement? comment?).

EDIT: ça semble être realloc, bon je vais faire 3 implémentation, une en Qt, une en C++ avec liste, une en C.

Vous me conseillé quoi en C++, stl::vector, stl::list?
alpha_one_x86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 23h47   #8
Expert Confirmé Sénior
 
Développeur informatique
Inscription : novembre 2006
Messages : 4 222
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : novembre 2006
Messages : 4 222
Points : 5 309
Points : 5 309
Citation:
Envoyé par alpha_one_x86 Voir le message
Je sais pas pourquoi, j'ai eu une grosse perte de performance de l'ordre de 1000 d'un coup.
je ne connais pas Qt mais ce qu'il faut essayer c'est de fixer la taille de la liste à une taille initiale....parce que sinon la classe va réallouer de manière fréquente et la mémoire va se fragmenter.
Par exemple pour les classes MFC qui sont un peu équivalentes à Qt mais spécifiques à Microsoft le MSDN conseille explicitement de fixer une taille initiale pour les conteneurs comme CArray ou CList.
Donc je suggérrais dans faire autant pour QList

Citation:
Before using an array, use SetSize to establish its size and allocate memory for it. If you do not use SetSize, adding elements to your array causes it to be frequently reallocated and copied. Frequent reallocation and copying are inefficient and can fragment memory.
Avec std::vector ou std::list tu risques d'avoir le même problème...
__________________
Alea Jacta Est
Mat.M est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 03/02/2012, 00h01   #9
Nouveau Membre du Club
 
Avatar de alpha_one_x86
 
Étudiant
Inscription : décembre 2006
Messages : 305
Détails du profil
Informations personnelles :
Localisation : France, Somme (Picardie)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2006
Messages : 305
Points : 34
Points : 34
Envoyer un message via ICQ à alpha_one_x86 Envoyer un message via MSN à alpha_one_x86
Même probléme en préallouant, mais ça semble pas venir qu'un probléme de fragmentation mémoire.

En plus linux défragemente assez bien la mémoire, et j'ai pas de pression mémoire sur mon systéme.
alpha_one_x86 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 03/02/2012, 09h03   #10
Membre du Club
 
Avatar de Jerome S
 
Homme Jérôme
Développeur informatique
Inscription : août 2011
Messages : 59
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 59
Points : 69
Points : 69
http://qt.developpez.com/doc/4.7/qlist.html

Citation:
const T & QList::at ( int i ) const

Returns the item at index position i in the list. i must be a valid index position in the list (i.e., 0 <= i < size()).

This function is very fast (constant time).
Citation:
T & QList::operator[] ( int i )

Returns the item at index position i as a modifiable reference. i must be a valid index position in the list (i.e., 0 <= i < size()).

This function is very fast (constant time).
Les fonctions at et l'opérateur [] effectuent les mêmes choses. De plus, ils disent que la fonction est censée être rapide...
__________________
Dans le monde, il y a 10 types de personnes. Ceux qui comprennent ce message et les autres
Jerome S est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 09h11   #11
Nouveau Membre du Club
 
Avatar de alpha_one_x86
 
Étudiant
Inscription : décembre 2006
Messages : 305
Détails du profil
Informations personnelles :
Localisation : France, Somme (Picardie)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2006
Messages : 305
Points : 34
Points : 34
Envoyer un message via ICQ à alpha_one_x86 Envoyer un message via MSN à alpha_one_x86
Oui, c'est cencé étre rapide. Hors c'est pas le cas.
alpha_one_x86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 10h51   #12
Membre éclairé
 
Homme
Inscription : février 2010
Messages : 191
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : février 2010
Messages : 191
Points : 307
Points : 307
Ligne 460 :
Code :
to_send_map_management_move[moveClient_index].movement_list << moveClient_tempMov;
Si je comprend bien tu ajoutes "moveClient_tempMov" en fin d'une liste.
Je ne sais pas ce qu'est ce "moveClient_tempMov", mais ça ressemble à une structure qui va être recopiée dans la liste. Le temps à cet endroit dépend certainement plus de la copie de la structure (ou classe) que de l'ajout en fin de liste.

Peux-tu peut-être donner aussi la définition de tes structures et listes qui posent problème ?
ness522 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 11h04   #13
Nouveau Membre du Club
 
Avatar de alpha_one_x86
 
Étudiant
Inscription : décembre 2006
Messages : 305
Détails du profil
Informations personnelles :
Localisation : France, Somme (Picardie)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2006
Messages : 305
Points : 34
Points : 34
Envoyer un message via ICQ à alpha_one_x86 Envoyer un message via MSN à alpha_one_x86
http://pastebin.com/ahWtC9Ni
et
http://pastebin.com/54YUXpXc
Mais la d'aprés le profiler c'est vraiment pour 75% du temps cpu le operator[] qui fait chier.
alpha_one_x86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 11h38   #14
Modérateur
 
Homme
Ingénieur développement logiciels
Inscription : mai 2009
Messages : 575
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 23
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2009
Messages : 575
Points : 916
Points : 916
Ça ne répondra pas à ta question (tu peux faire du profiling, profites-en pour nous éclairer ), mais :
- pourquoi utiliser QList au lieu de QMap ou QHash pour stocker des éléments avec un id, qui pourrait servir de clef ?
- tu dis que l'operateur[] est lent, mais tu l'utilises deux fois de suite pour attraper le même élément, au lieu de créer une seule fois une référence à cet élément.

Ensuite peut-être que tu peux étudier les autres possibilités offertes par Qt pour boucler (je ne peux pas t'en dire plus, peut-être QMutableListIterator ?).

Sinon, les résultats de vos recherches m'intéressent aussi, car je faisais confiance aux classes Qt pour être bien optimisées.
Troudhyl est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 11h38   #15
Membre éclairé
 
Homme
Inscription : février 2010
Messages : 191
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : février 2010
Messages : 191
Points : 307
Points : 307
J'ai pas d'idée, l'opérateur [] te renvoie une référence modifiable, et travaille en temps constant, ce qui veut dire que le temps est le même quel que soit la taille de la liste !

Ca ne me semble donc pas être là que le bât blesse, j'ai pas d'expérience des profilers, sont-ils toujours précis pour ce genre de trucs (descendre si bas dans le raffinement des fonctions qui usent le CPU). J'aurais tendance à regarder à un plus haut niveau...
ness522 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 12h37   #16
Nouveau Membre du Club
 
Avatar de alpha_one_x86
 
Étudiant
Inscription : décembre 2006
Messages : 305
Détails du profil
Informations personnelles :
Localisation : France, Somme (Picardie)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2006
Messages : 305
Points : 34
Points : 34
Envoyer un message via ICQ à alpha_one_x86 Envoyer un message via MSN à alpha_one_x86
Sous linux, apprement il compte le nombre d'entrée, 1) utilisation de mcount de libc, 2) le temps semble proportionnel à la taille de la liste
Je me trompe peu étre.
alpha_one_x86 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 03/02/2012, 13h06   #17
Membre du Club
 
Avatar de Jerome S
 
Homme Jérôme
Développeur informatique
Inscription : août 2011
Messages : 59
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 59
Points : 69
Points : 69
Ils disent que l'index doit être dans un range valide, donc ca signifie qu'ils ne le vérifient pas. Il n'y a donc pas de raison qu'il compte le nombre d'entrées...
__________________
Dans le monde, il y a 10 types de personnes. Ceux qui comprennent ce message et les autres
Jerome S est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 14h03   #18
yan
Rédacteur/Modérateur
 
Avatar de yan
 
Homme yan verdavaine
Ingénieur expert
Inscription : mars 2004
Messages : 9 643
Détails du profil
Informations personnelles :
Nom : Homme yan verdavaine
Âge : 30
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Ingénieur expert
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mars 2004
Messages : 9 643
Points : 12 260
Points : 12 260
Question bête. Tu est bien en release?
Autre question, tu dit que ça prend 80%, mais si tu l'utilise partout, ce résultat n'est il pas logique?
Ne faut il pas plutôt regarder l’occupation CPU des méthodes qui l'appel?
Que fait ton bout de code qui pose problème?

Ca me semble être surtout un problème d’algorithme qui te génère trop de boucle sur ta liste.
__________________
[Critique] L'art du game design : 100 objectifs pour mieux concevoir vos jeux
QExtend
Moi
Android : TVA Calculator & My Tip

-----------------------------------------------------------------------------
Intéressé pour participer à la rubrique Qt ou Android? n'hésitez pas à m'envoyer un MP
yan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 14h19   #19
Nouveau Membre du Club
 
Avatar de alpha_one_x86
 
Étudiant
Inscription : décembre 2006
Messages : 305
Détails du profil
Informations personnelles :
Localisation : France, Somme (Picardie)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2006
Messages : 305
Points : 34
Points : 34
Envoyer un message via ICQ à alpha_one_x86 Envoyer un message via MSN à alpha_one_x86
Je suis en debug. La suppression du flag: -pg améliore grandement les choses, passage de l'utilisation du cpu, de 100% à 10%, 7% en mode release, -march=native ne change rien

80% car dans l'algo c'est sur ces point que ça passe le plus.
Les grossees fonction sont: ClientMapManagement::moveThePlayer() et ClientMapManagement::moveClient(), maintenant passé à 90% de temps cpu

Le code qui pose probléme à un compléxité carré (je peu rien y faire, c'est la mise des déplacements des autres joueurs dans la liste du joueurs, et comme il faut le faire pour chaque joueurs...).
Mais bon, déjà viré 80% du temps cpu, aprés j'optimiserai le reste...
Et vu que la complexité et carré juste à cette endroit, j'aimerai optimisé un max ce bout de code.
alpha_one_x86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 14h39   #20
Membre éclairé
 
Homme
Inscription : février 2010
Messages : 191
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : février 2010
Messages : 191
Points : 307
Points : 307
Citation:
Envoyé par alpha_one_x86 Voir le message
Je suis en debug.
...

bah oui là alors ça chaque accès au tableau est potentiellement vérifié par des Q_ASSERT, c'est donc beaucoup plus lent et pas très représentatif.
ness522 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h03.


 
 
 
 
Partenaires

Hébergement Web