|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Nouveau Membre du Club
![]() |
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.
__________________
Ultracopier (pour remplacer votre boite de dialogue de copie de fichiers) Comparatif de ultracopier, supercopier, teracopy, copyhandler Pokecraft, mon mmorpg hautes performances, insensible aux latences, en Qt. (Recrutement payé) |
|
00
|
|
|
#2 |
![]() ![]() ![]() |
![]() 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 ! |
|
00
|
|
|
#3 |
|
Nouveau Membre du Club
![]() |
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.
__________________
Ultracopier (pour remplacer votre boite de dialogue de copie de fichiers) Comparatif de ultracopier, supercopier, teracopy, copyhandler Pokecraft, mon mmorpg hautes performances, insensible aux latences, en Qt. (Recrutement payé) |
|
00
|
|
|
#4 | ||
|
Nouveau Membre du Club
![]() Inscription : juillet 2009 Messages : 49 ![]() |
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 :
|
||
|
|
00
|
|
|
#5 |
|
Nouveau Membre du Club
![]() |
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
__________________
Ultracopier (pour remplacer votre boite de dialogue de copie de fichiers) Comparatif de ultracopier, supercopier, teracopy, copyhandler Pokecraft, mon mmorpg hautes performances, insensible aux latences, en Qt. (Recrutement payé) |
|
00
|
|
|
#6 |
|
Nouveau Membre du Club
![]() Inscription : juillet 2009 Messages : 49 ![]() |
ptr est donc un tableau, l'accès avec [] doit être plus rapide
|
|
|
00
|
|
|
#7 |
|
Nouveau Membre du Club
![]() |
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?
__________________
Ultracopier (pour remplacer votre boite de dialogue de copie de fichiers) Comparatif de ultracopier, supercopier, teracopy, copyhandler Pokecraft, mon mmorpg hautes performances, insensible aux latences, en Qt. (Recrutement payé) |
|
00
|
|
|
#8 | ||
|
Expert Confirmé Sénior
![]() Développeur informatique Inscription : novembre 2006 Messages : 4 222 ![]() |
Citation:
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:
__________________
Alea Jacta Est |
||
|
|
01
|
|
|
#9 |
|
Nouveau Membre du Club
![]() |
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.
__________________
Ultracopier (pour remplacer votre boite de dialogue de copie de fichiers) Comparatif de ultracopier, supercopier, teracopy, copyhandler Pokecraft, mon mmorpg hautes performances, insensible aux latences, en Qt. (Recrutement payé) |
|
01
|
|
|
#10 | ||
|
Membre du Club
![]() Jérôme Développeur informatique Inscription : août 2011 Messages : 59 ![]() |
http://qt.developpez.com/doc/4.7/qlist.html
Citation:
Citation:
__________________
Dans le monde, il y a 10 types de personnes. Ceux qui comprennent ce message et les autres |
||
|
|
00
|
|
|
#11 |
|
Nouveau Membre du Club
![]() |
Oui, c'est cencé étre rapide. Hors c'est pas le cas.
__________________
Ultracopier (pour remplacer votre boite de dialogue de copie de fichiers) Comparatif de ultracopier, supercopier, teracopy, copyhandler Pokecraft, mon mmorpg hautes performances, insensible aux latences, en Qt. (Recrutement payé) |
|
00
|
|
|
#12 |
|
Membre éclairé
![]() ![]() Inscription : février 2010 Messages : 191 ![]() |
Ligne 460 :
Code :
to_send_map_management_move[moveClient_index].movement_list << moveClient_tempMov; 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 ? |
|
|
00
|
|
|
#13 |
|
Nouveau Membre du Club
![]() |
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.
__________________
Ultracopier (pour remplacer votre boite de dialogue de copie de fichiers) Comparatif de ultracopier, supercopier, teracopy, copyhandler Pokecraft, mon mmorpg hautes performances, insensible aux latences, en Qt. (Recrutement payé) |
|
00
|
|
|
#14 |
![]() ![]() Ingénieur développement logiciels Inscription : mai 2009 Messages : 575 ![]() |
Ça ne répondra pas à ta question (tu peux faire du profiling, profites-en pour nous éclairer
- 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. |
|
|
00
|
|
|
#15 |
|
Membre éclairé
![]() ![]() Inscription : février 2010 Messages : 191 ![]() |
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... |
|
|
00
|
|
|
#16 |
|
Nouveau Membre du Club
![]() |
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.
__________________
Ultracopier (pour remplacer votre boite de dialogue de copie de fichiers) Comparatif de ultracopier, supercopier, teracopy, copyhandler Pokecraft, mon mmorpg hautes performances, insensible aux latences, en Qt. (Recrutement payé) |
|
01
|
|
|
#17 |
|
Membre du Club
![]() Jérôme Développeur informatique Inscription : août 2011 Messages : 59 ![]() |
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 |
|
|
00
|
|
|
#18 |
![]() ![]() yan verdavaineIngénieur expert Inscription : mars 2004 Messages : 9 643 ![]() |
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 |
|
|
00
|
|
|
#19 |
|
Nouveau Membre du Club
![]() |
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.
__________________
Ultracopier (pour remplacer votre boite de dialogue de copie de fichiers) Comparatif de ultracopier, supercopier, teracopy, copyhandler Pokecraft, mon mmorpg hautes performances, insensible aux latences, en Qt. (Recrutement payé) |
|
00
|
|
|
#20 |
|
Membre éclairé
![]() ![]() Inscription : février 2010 Messages : 191 ![]() |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com