Alors venez donner un coup de main.... Toujours dans l'optique d'optimisation évoquée ici [1] d'optimisation de GNOME, dimanche 30 octobre aura lieu le "Performance Love Day" . Cela durera au minimum de 14H00 à 3H00 UTC, soit à cause du passage à l'heure d'hiver, 15H00 à 4H00. Lisez [2] pour connaitre tous les détails.
Pour cela l'outil sysprof [3] est utilisé, qui permet de trouver les fonctions dans lesquelles le programme passe le plus de temps. Une action très simple est de juste lancer l'outil et le programme à analyser. Vous repérez les "goulets d'étranglement", et envoyer la trace générée par sysprof. Vous pouvez aussi aider à trier les bugs de performance sur le bugzilla.
Alors bonne chasse !
Attention, n'oubliez pas si vous utilisez Mandriva 2006 que vous avez une version de GNOME de retard (2.10 au lieu de 2.12). Il vaudrait mieux installer GNOME avec jhbuild [4] (compile GNOME à partir du cvs) ou garnome [5] (compile GNOME à partir des dernier paquets releasés)
[1] http://linuxfr.org/2005/10/14/19737.html
[2] http://live.gnome.org/GnomeLove_2fPerformanceLoveDay
[3] http://live.gnome.org/Sysprof
[4] http://www.gnome.org/~newren/tutorials/developing-with-gnome(...)
[5] http://cipherfunk.org/garnome/
# Heure
Posté par liberforce (site web personnel) . Évalué à 2.
heure française, bien sûr, pardon aux autres francophones.
[^] # Re: Heure
Posté par Fabimaru (site web personnel) . Évalué à 7.
[^] # Re: Heure
Posté par Narmer . Évalué à 7.
[^] # Re: Heure
Posté par boris . Évalué à 7.
# Attention : message sans intérêt
Posté par Obsidian . Évalué à 4.
Sans vouloir lancer un gros troll, c'est un excellent environnement de bureau mais pour ce que j'en vois (c'est-à-dire un peu plus que ce qui est visible sur l'interface graphique, mais pas beaucoup plus loin non plus), un Windows95 faisait déjà de même avec des ressources bien plus limitées (au prix, c'est vrai, d'un certain nombre de raccourcis assez sales).
Je dis cela parce que la lenteur n'est pas le seul point noir de GNOME, sa sobriété toute relative en est également un car tout le monde ne travaille pas sur sa machine personnelle. Nous utilisons par exemple, au travail, des gros serveurs SUN Solaris de dernière génération, ayant adopté GNOME ¹, le tout attaqué par une batterie de terminaux X type thin client. Tous les bureaux GNOME des utilisateurs partagent la même machine. Je ne sais pas si GNOME sait en tirer parti ou pas ...
¹ : http://linuxfr.org/2001/05/23/3627.html
[^] # Re: Attention : message sans intérêt
Posté par liberforce (site web personnel) . Évalué à 6.
Quand à tes thin clients, il me semble que les bibliothèques sont chargées en mémoire sur tes serveurs, donc chargées une seule fois pour tous les clients. GNOME ou pas, je crois que cela n'a pas de rapport.
[^] # Re: Attention : message sans intérêt
Posté par Guillaume Knispel . Évalué à 4.
[^] # Re: Attention : message sans intérêt
Posté par liberforce (site web personnel) . Évalué à 3.
[^] # Re: Attention : message sans intérêt
Posté par Obsidian . Évalué à 2.
[^] # Re: Attention : message sans intérêt
Posté par WH (site web personnel) . Évalué à 2.
# [GNOME 2.12 sous 2006.0] dispo pour utilisateurs club Mandriva
Posté par Fabrice FACORAT (site web personnel) . Évalué à 5.
Plus d'info : http://club.mandriva.com/xwiki/bin/Main/Gnome212Rpms
sinon vous pouvez suivre ce blog qui est très intéressant : http://primates.ximian.com/~federico/news-2005-10.html#27
[^] # Re: [GNOME 2.12 sous 2006.0] dispo pour utilisateurs club Mandriva
Posté par liberforce (site web personnel) . Évalué à 5.
Le bug:
http://bugzilla.gnome.org/show_bug.cgi?id=160917
L'analyse:
http://primates.ximian.com/~federico/news-2005-10.html#gedit(...)
[^] # Re: [GNOME 2.12 sous 2006.0] dispo pour utilisateurs club Mandriva
Posté par BAud (site web personnel) . Évalué à 2.
Pour ceux qui sont au club ces backports de cooker seront-ils mis à jour (pas de maintenance ok... mais des corrections) ? comment se passeront les mises à jour ? un répertoire update dédié au club ?
Dans le cas d'une réponse négative, un retour à Gnome 2.10 est-il prévu ?
Ne vaut-il pas mieux - comme fait généralement pour une cooker - y dédier une partition afin de pouvoir revenir sur une version stable ensuite ? (perso c'est ce que je recommanderais : mieux vaut prévenir que guérir, quand il y en aura pleins qui demanderont quand les mises à jour seront là et à qui il faudra annoncer "ah bin dans une 2006.1 qui arrivera bientôt... ou sinon passer en cooker....").
En tout cas, bonne initiative, ça peut permettre de ramener du monde sur le sujet et enlever un peu de lenteur à Gnome.
[^] # Re: [GNOME 2.12 sous 2006.0] dispo pour utilisateurs club Mandriva
Posté par Pascal Terjan (site web personnel) . Évalué à 5.
Sinon je pense que celui de cooker s'installe sans pb sur une 2006 (au pire il faut rebuilder le rpm) mais j'ai pas testé.
[^] # Re: [GNOME 2.12 sous 2006.0] dispo pour utilisateurs club Mandriva
Posté par liberforce (site web personnel) . Évalué à 4.
[^] # Re: [GNOME 2.12 sous 2006.0] dispo pour utilisateurs club Mandriva
Posté par liberforce (site web personnel) . Évalué à 2.
ftp://mandrake.contactel.cz/Mandrakelinux/devel/cooker/i586/(...)
[^] # Re: [GNOME 2.12 sous 2006.0] dispo pour utilisateurs club Mandriva
Posté par Bruce Le Nain (site web personnel) . Évalué à 2.
à propos, le media "club contrib", il est stable ou instable ? Qu'y a t-il dedans ?
# Il y a du travail de fait
Posté par ondex . Évalué à 5.
http://www.gnome.org/~lcolitti/gnome-startup/analysis/
En résumé il a réussi à gagner 17 secondes au démarrage de Gnome. Il a fait une liste de patch dont certains ont déjà été intégrés.
Dans son travail, il apparait surtout que pour des raisons de compatibilité, gconf2 n'est pas optimisé. En cassant la compatibilité de gconf2 avec les Gnome avant 2.6, il gagne 7 secondes !!!
Reste à espérer que tout son travail soit propre pour être accepter dans la version 2.14 de Gnome.
[^] # Re: Il y a du travail de fait
Posté par morphalus . Évalué à -2.
[^] # Re: Il y a du travail de fait
Posté par liberforce (site web personnel) . Évalué à 3.
[^] # Re: Il y a du travail de fait
Posté par ondex . Évalué à 1.
Ce que propose Colitti, c'est charger les certaines librairies importante (Gtk) entièrement au début plutôt que de le faire petit à petit, c'est aussi de lire toute la conf gconf en une fois et la parser petit à petit, etc...
Donc, je ne pense pas que son processeur ou sa RAM ne joue vraiment. Par contre, son disque dur (Toshiba MK3021GAS 30GB, 4200 RPM hard disk) est vraiment lent. Je ne sais pas combien de temps il est possible de gagner sur un PC de bureau avec un disque dur à 7200RPM.
Mais bon, même 5 ou 10 secondes de gagnés, c'est déjà ça de pris...
[^] # Re: Il y a du travail de fait
Posté par liberforce (site web personnel) . Évalué à 2.
Pour gconf, un des problèmes, c'est que c'est fait en plein de petits fichiers, ce qui augmente les temps de lecture. ça fait un petit moment qu'on sait que ce sont les accès disque qui sont le goulot d'étranglement (déjà évoqué lors du GUADEC 2005) par Robert Love:
A LIRE ABSOLUMENT !
http://rlove.org/talks/rml_guadec_2005.sxi
Ces deux phrases résument le problème :
Ce qui fait que plein de petit fichiers pour gconf entraine des performances catastrophiques...
[^] # Re: Il y a du travail de fait
Posté par Yusei (Mastodon) . Évalué à 2.
Je l'ai fait il y a quelques temps, mais je n'ai pas senti de grosse amélioration. Certainement rien de l'ordre des 10 secondes, et pourtant j'ai un disque dur à 4200 rpm. Quelqu'un a essayé et a eu des résultats positifs ?
[^] # Re: Il y a du travail de fait
Posté par Victor STINNER (site web personnel) . Évalué à 3.
Résumé en une phrase :
Plus d'info ici :
http://get-e.org/Main/FAQs.html#8
Haypo
[^] # Re: Il y a du travail de fait
Posté par imr . Évalué à 3.
Et les thèmes seront ils faciles à faire ou faudra t il avoir quelques années de programmation dans les pattes?
[^] # Re: Il y a du travail de fait
Posté par Victor STINNER (site web personnel) . Évalué à 2.
Haypo
# autre optimisation
Posté par Erwan . Évalué à 3.
Les GList sont des listes chainees, donc les temps d'acces sont longs. Avec un tableau (un hash quand on veut une taille variable), on accede directement a l'element qu'on cherche.
[^] # Re: autre optimisation
Posté par liberforce (site web personnel) . Évalué à 2.
<<corrigez moi si je dis une bêtise>>
[^] # Re: autre optimisation
Posté par allcolor (site web personnel) . Évalué à 4.
[^] # Re: autre optimisation
Posté par Erwan . Évalué à 6.
Par consequent, si on veut l'element no 100 d'un tableau, on a juste a incrementer la valeur du pointeur de 100. On sait ou va se trouver l'element dans la memoire. A l'inverse, une liste chainee c'est un ensemble de paire (donnees, pointeur suivant). Donc on est oblige de suivre la liste du debut jusqu'a l'element voulu pour arriver jusqu'a l'element qu'on cherche.
Le probleme des tableaux, c'est que la taille est fixe. Forcement, vu que c'est une zone memoire contigue, si on ecrit des choses derriere on ne peut pas agrandir le tableau.
La solution hybride c'est les tables de hachage. Un gros, c'est un tableau de listes chainees.
Exemple: on veut classer des mots. On fait un tableau de 26 cases avec les lettres de l'alphabet (a, b, c, d, e...). A chaque lettre est associee une liste chainee. Et si on veut classer le mot "troll" (ou le rechercher), on va directement au "t" puis on parcours la liste chainee pour trouver le mot (ou l'inserer par ordre alphabetique).
Bien sur, une telle table de hachage n'est pas tres bonne parce qu'on va avoir beaucoup de collisions (cad: d'elements inseres dans la meme liste chainee). Dans l'ideal on ne doit avoir que quelques elements par liste, pour que l'acces soit plus rapide.
[^] # Re: autre optimisation
Posté par Joris Dedieu (site web personnel) . Évalué à -1.
Il me semblait également qu'un tableau permet un acces aléatoire alors qu'une liste chainée ne permet qu'un acces sequentiel ?
[^] # Re: autre optimisation
Posté par gasche . Évalué à 3.
[^] # Re: autre optimisation
Posté par Joris Dedieu (site web personnel) . Évalué à 2.
[^] # Re: autre optimisation
Posté par liberforce (site web personnel) . Évalué à 2.
[^] # Re: autre optimisation
Posté par Yusei (Mastodon) . Évalué à 4.
Imaginons ce tableau, dans lequel je veux déplacer 6 en première place
1 2 3 4 5 6 7
Je dois d'abord déplacer 1, 2, 3, 4 et 5 d'un cran vers la droite, puis placer 6 en première place. Si j'avais eu une liste (simplement) chainée, j'aurais juste eu à faire:
5.suivant = 7
6.suivant = 1
liste.premier = 6
[^] # Re: autre optimisation
Posté par ham . Évalué à 1.
C'est plus un probleme d'API que de savoir si tel ou tel structure de donné est plus efficace.
Idealement (glib, java, C#, mono,c++...) je m'attend a avoir un objet de type Liste qui offre une interface simple et clair.
Ensuite il peut y avoir autant de specialisation possible que l'on veut,
l'implementation par default devrais etre la plus rapide en moyenne.
Si on ne fait pas de deplacement dans la liste, on prend un truc du genre liste chainé de tableau, arbre de tableau , ...
dans le cas de la Glib et d'apres les commentaires des gens qui ont regardé le mauvais usage de la GList, c'est que les dev ne lisent pas la doc, la doc n'est pas assez clair, l'API devrais etre repensé.
[^] # Re: autre optimisation
Posté par Yusei (Mastodon) . Évalué à 4.
Le problème si on a une seule interface commune aux différents types de données, c'est qu'on va être obligé de définir toutes les opérations pour tous les types, même quand une opération est très coûteuse.
Par exemple on va avoir une opération "obtenir l'objet précédent" qui sera disponible aussi dans les GSList, malgré le fait que ce soit une opération très coûteuse dans une GSList (on doit parcourir la liste), et très peu coûteuse dans une GList ou GArray (accès en temps constant).
Actuellement, GSList ne propose pas cette opération. Donc si j'ai besoin d'obtenir l'objet précédent, plusieurs cas se présentent:
- j'adapte mon algo pour avoir toujours un pointeur sur l'objet précédent, et donc c'est bien mieux qu'avoir utilisé une fonction générique
- je code une fonction générique, et j'ai une bonne chance de me rendre compte que c'est mauvais
- j'utilise un type de données plus adapté, comme une GList.
Au final, même si l'on masque les spécificités des types de données dans une interface commune, on a quand même besoin de savoir ce qui est utilisé derrière si on veut être efficace.
[^] # Re: autre optimisation
Posté par vrm (site web personnel) . Évalué à 1.
throw new UnsupportedException("send a patch");
:)
[^] # Re: autre optimisation
Posté par ham . Évalué à 3.
d'ou ma remarque d'utiliser par defaut des listes qui sont performantes en moyenne, comme, au pif, des listes doublement chainé.
Le mechanisme proposé permet justement de pouvoir choisir ce qui est utilisé derriere SI on veut etre efficace.
Actuellement il faut connaitre les details de l'implementation derriere, ses limites,...etc. avant de l'utiliser, et ca c'est mal.
Quand j'utilise une API je m'attend a avoir un truc qui me simplifie la vie, ensuite si je sait que mon programme doit en moyenne augmenter ses donnés de 200 élements, j'ai pas envie de changer tout mes types a chaque fois, l'API devrait me permettre de la regler.
De plus les exceptions, ca peut servir a gérer ce genre de truc, meme si c'est ca pourrais etre plus propre:
- un objet de base
- une interface si besoin est pour des propriété particulière
- des itérateurs
Enfin Cf les vecteurs en java,
il suffit de faire une GList abstraite et que le dev choissisent une implementation precise.
[^] # Re: autre optimisation
Posté par Yusei (Mastodon) . Évalué à 3.
L'approche la plus propre que je connaisse est celle de la STL, où effectivement dans de nombreux cas on peut changer la structure de données sans changer le code, mais là non plus on n'est pas dispensé de savoir choisir entre les différents types de données. Et si tu choisis le mauvais type et que tu fais un algo en fonction de ce type, tu devras quand même réécrire ton code si tu changes d'avis.
Ce que je veux dire, c'est que tu peux abstraire autant que tu veux tes types de données, au moment de coder l'algo tu es obligé de savoir des choses basiques comme:
- Je peux parcourir mes éléments séquentiellement ou pas ?
- Je peux accéder à un élément n'importe où ou pas ?
- Je peux parcourir dans les deux sens, ou dans un seul ?
- Je peux déplacer des éléments ou pas ?
- Je peux stocker beaucoup de données ou pas ?
(Pour toutes ces questions, il faut bien sûr penser "en temps et en espace raisonnables", sinon la réponse est toujours oui)
Et même si ton API te fournit le même ensemble de fonction pour tous les types, ça ne veut pas dire que ces fonctions sont efficaces.
Par exemple si tu utilises comme abstraction des iterateurs, ton API ne te donnera pas d'iterateur qui puisse se déplacer dans les deux sens pour une liste simplement chaînée. Ou bien si elle te fournit un iterateur qui le fait, il sera très lent.
Pareil pour les listes doublement chaînées, tu auras sûrement une fonction "obtenir l'élément à la position i", mais cette fonction sera lente. Donc si tu veux être efficace, quoi qu'il arrive, tu devras connaître les limites du type de données que tu manipules.
(Après, savoir si ça vaut le coup de se casser la tête pour choisir le bon type de données, c'est un autre problème. Dans beaucoup de cas, utiliser un Vector en Java sera très acceptable. Mais si tu as besoin d'être efficace, pas le choix)
[^] # Re: autre optimisation
Posté par ham . Évalué à 1.
Je ne dis pas que l'API doit fournir une classe liste quifaittout, je dis que l'API doit fournir une abstraction, avec plusieurs niveau si nécessaire,
et si l'API propose une implémentation par defaut (GDefaultList), peut etre prendre un truc vaguement générique, facilement changeable.
Ensuite pour avoir des programmes quitorche, c'est encore mieux si l'API a un flag profiling pour voir les statistiques d'utilisations des fonctions, avec des infos utiles (nombre d'elements, .. toussa).
Je pense que les cas ou l'on recherche l'optimisation est bien plus faible que les cas ou on veux juste une liste.
Sinon je suis allé voir la doc de la GLib et les type proposé sont trop spécialisé (i.e il manque le vecteur de java).
Si on veut utiliser la Glib, il n'y a pas vraiment une liste a tout faire avec performances correcte.
Le plus proche est le GArray, mais ca ressemble a un tableau avec du realloc, eventuellement avec de la préalocation,
pas des trucs du genre <truc tres opaque> avec une API type tableau,
par ex partitioner l'espace des index dans un arbre a arité fixe, le tout paramétrable, avec de bon defaut.
Ensuite si on veut s'amuser en C on peut commencer a mettre les donnés de liste dans la structure a stocker, et stocker des offset dans une strucuture de type liste.
[^] # Re: autre optimisation
Posté par fmaz fmaz . Évalué à 3.
Pour rechercher si un élément est dans ta liste, tu dois forcément
parcourir ta liste ce qui est linéaire alors qu'avec un arbre binaire,
c'est en temps logarithmique.
[^] # Re: autre optimisation
Posté par ham . Évalué à 3.
Les arbres binaire, il y en a plein, si ce n'est pas equilibré, ben c'est moin interessant (Cf quick sort et tri-fusion).
Une premiere etape pour choisir ses structure de données:
http://en.wikipedia.org/wiki/List_of_data_structures
et ensuite
http://www.nist.gov/dads/
Pour avoir plein d'algo, et de pointeurs
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.