Qt, select(), poll() et epoll()

Bonjour, je viens vous parler d’un problème récurent avec Qt. La boucle d’évènement, c’est la base de Qt, car c’est grâce à elle que Qt fait ces signaux/slots, les divers events, le réseau, et bien d’autre chose.

Problème

Le problème est le suivant. Ce système s’appuie sur les mécanismes interne de l’os, select() est utilisé sur les systèmes unix. Hors ce procédé est obsoléte, en plus, plus il as de chose utilisé ou non, plus il vas être lent (complexité n(x)). Exemple:

  • En programmation, ça veux dire que si vous avec 30 sockets tcp d’ouvert (ça arrive souvent avec un navigateur moderne), 40 dossiers surveillés (pour les changements), bref une bonne partie des choses basé sur les events, et qui utilise un nombre minimal de connexion signals/slots (les programmes en compte je pense 150 pour les plus petit, 500 pour les moyens). Alors l’application vas ralentir car elle vas regarder dans une liste des choses ouverte celle qui corresponds à la votre
  • Coté utilisateur: Les applications comme Ultracopier, ktorrent, dolphin (explorateur de fichiers), … vont ralentir petit à petit. ktorrent vas être beaucoup plus lent qu’il ne le devrai juste à cause de cette histoire (d’un ordre de 10x d’après l’auteur)

Solution

 

L’utilisation d’epoll() permet d’avoir une complexité fixe n(1), ça veux dire que le temps de traitement est fixe, et donc ne dépends pas du nombre de fichier affiché à l’écran, du nombre de torrent ouvert, du nombre de socket tcp ouvert.

Qt dit que c’est pour l’utilisation mémoire, hors sur les petites applications 10Ko de mémoire, c’est pas ce qui vas changer grands choses, surtout que chez moi (mesuré avec l’outils massif de valgrind), le système signals/slots + les autres truc de Qt consomme 90% de la mémoire prise par mon application. Et les grosses application deviennes impraticable ou trés lent. Et les gros bureaux comme KDE, qui ont des dizaines de milliers de descripteur ouvert, j’en parle même pas.

Conclusion

Hors il n’existe pour l’instant aucun event dispatcher fini/stable avec epoll pour Qt que j’ai pu trouver. Il serai utile de trouver ce genre d’event dispatcher, pour avoir accès à ces méthodes même si Qt ne veux pas y passer.

N’étant pas un expert sur ce que je vous ai dit plus haut, il ce peu qu’il y ai des erreurs.

Publié par