37 votes

Quelle bibliothèque de signaux/slots C++ dois-je choisir ?

Je veux utiliser une bibliothèque de signaux/slots dans un projet qui n'utilise pas QT. J'ai des exigences assez basiques :

  1. Connectez deux fonctions avec un nombre quelconque de paramètres.
  2. Les signaux peuvent être connectés à plusieurs fentes.
  3. Déconnexion manuelle de la connexion du signal/de la fente.
  4. Performances décentes - l'application est basée sur des images (c'est-à-dire pas sur des événements) et je veux utiliser les connexions dans chaque image.

J'ai lu un comparaison entre libsigc++ et Boost.Signals . J'ai également lu que Boost.Signals souffre de mauvaises performances. Cependant, je sais qu'il existe d'autres bibliothèques et je ne suis toujours pas sûr de la bibliothèque que je dois choisir.

Y a-t-il des recommandations pour une bibliothèque de signaux/slots ?

18voto

Klaim Points 24511

D'abord, essayez quand même avec boost::signal. Ne supposez pas que ce ne sera pas assez rapide avant d'avoir essayé dans votre cas spécifique, c'est-à-dire votre application.

Si ce n'est pas assez efficace, peut-être quelque chose comme FastDelegate répondra à vos besoins ? (Je ne l'ai pas essayé mais j'ai entendu dire que c'était une bonne solution dans certains cas où boost::signal ne semble pas convenir).

Quoi qu'il en soit, si votre application utilise le signal à chaque trame, il peut être intéressant de remplacer le système de signal par quelque chose de plus simple, comme un conteneur qui contient des objets/fonctions qui seront appelés à chaque trame. Le signal est plus fait pour permettre une gestion immédiate des "événements" que pour rendre un cycle de boucle dynamique (permettant de changer les fonctions appelées à chaque trame). (J'ai ma propre solution (MISE À JOUR : il est très vieux et archaïque maintenant) que j'utilise beaucoup dans un jeu et par exemple je n'ai aucun problème avec la performance, donc peut-être quelque chose de similaire pourrait aider).

15voto

Dustin Getz Points 8514

Bibliothèque d'événements très, très rapide sur les formulaires de Gamedev.net

En profilant un code sur lequel j'avais sur lequel j'ai travaillé récemment, j'ai été surpris et consterné de constater que boost::signals flottant au sommet. Pour ceux d'entre vous qui ne le savent pas, boost::signals est une merveilleuse et utile bibliothèque de signal/slot qui peut être utilisée avec boost::bind pour la gestion d'événements basés sur des délégués, comme comme on le voit en C#. Elle est robuste, riche en fonctionnalités et flexible. Il l'est aussi, j'ai appris, incroyablement, terrifiant et lent. Pour beaucoup de gens qui utilisent boost::signals c'est très bien parce qu'ils n'appellent que très rarement des évènements. J'appelais plusieurs événements par image par objet, avec des résultats prévisibles.

Alors j'ai écrit le mien. Un peu moins flexible et riche en fonctionnalités. Il est optimisé pour la façon dont tout le monde a tendance à à utiliser les événements. Et les événements est quinze à quatre-vingt fois plus rapide plus rapide que boost::signals.

voir le lien

5voto

Catskul Points 3600

Les deux que vous avez énumérés sont les deux seuls qui valent la peine, à ma connaissance. Tout ce que j'ai vu a montré que libsigc++ était le meilleur en termes de performances. Comme vous l'avez vu dans la comparaison, il y a quelques cas où la syntaxe de boost est un peu plus jolie, mais juste un peu.

J'ai personnellement utilisé libsigc++ et j'en suis satisfait. Libsigc++ semble être utilisée par beaucoup plus de projets. Un coup d'œil rapide dans mon gestionnaire de paquets indique plus de 100 projets dépendant de libsigc++2. À mon avis, cela suffit à faire pencher la balance, surtout si l'on considère l'avantage en termes de performances et l'absence d'autres différences significatives.

Je dis libsigc++2.

4voto

Rodrigo Lopez Points 386

Je voterais pour Sigslots J'ai essayé quelques autres alternatives (boost, libsig++, FastDelegates) et aucune ne semble faire l'affaire. juste ce que je voulais : lier des fonctions ensemble de manière anonyme avec une déconnexion automatique sur-destruction de l'objet.

Sigslots était parfait pour nous car il s'agit d'un C++ parfaitement lisible, il est rapide, simple et fait le travail sans se gêner. Une petite chose, si vous voulez l'utiliser à partir de plusieurs bibliothèques, vous devrez peut-être ajouter :

COREEXTERN template class COREIMPEXP has_slots<SIGSLOT_DEFAULT_MT_POLICY>;

pour éviter les problèmes de liaison liés aux objets déjà définis.

3voto

asaenko Points 83

J'ai utilisé la bibliothèque boost signals2, et elle est très lente. Lors de la construction d'un objet avec des signaux boost, 99% du temps processeur est consommé par la pile de signaux boost. Lors de l'émission de signaux avec un seul slot simple, l'overhead est également très important. J'ai essayé libsigc++ et c'est nettement plus rapide. Libsigc++ semble être très rapide et flexible. Création de 40000 objets avec 9 signaux boost et 9 signaux libsigc++ :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X