10
votes

Signal / Slot C ++ le plus rapide / Slot Lib sans dépendance

Je vais passer des données haut / bas un objet de 5 à 10 couches à l'aide de signaux et de machines à sous. Ce qui devrait entraîner quelques milliers de signaux par seconde. Qui est de loin "j'ai cliqué sur un bouton". Tout mon objet les signalera également à une minuterie d'environ 100 ms afin qu'ils puissent faire du traitement.

Quelle serait la mise en oeuvre de signalisation / machine à sous la plus rapide qui serait petite et ne nécessite pas d'autres bibliothèques telles que Boost. (J'ai besoin de garder la taille totale de mon binaire très petit).

J'ai vu libsigc ++, Sigslot, CPP-Events,


1 commentaires

IMO Question importante: Cela doit-il être le fil en sécurité?


3 Réponses :


4
votes

Souvent, les bibliothèques de signal sont conçues pour faciliter l'utilisation, et non avec une forte performance en tête. Vous pouvez vérifier ce article peut-être utile tout en poursuivant une exécution rapide.

Dans votre cas, je commencerais à essayer le plus simple, comme Sigslot. Mais je n'utiliserais pas une bibliothèque de signaux dans de telles circonstances ... probablement une sorte de file d'attente de message, avec un timbre de temps quelconque.


0 commentaires

0
votes

Même la plupart des bibliothèques de signaux / emplacements / slots riches en fonctionnalités sont très légères. La vitesse de l'émission de signaux est dans la plupart des cas comparable à l'appel de la fonction virtuelle. En cas de bibliothèques gastriées telles que Boost :: Signaux et Libsigc ++, vous obtenez essentiellement la même performance que vous obtiendriez des pointeurs de fonction de passage.


1 commentaires

Les signaux invoquants ne sont que rapides avec des bibliothèques qui ne sont pas thread-coffre-fort. Et je n'ignorerais pas non plus connecté / déconnecter non plus, il existe certaines bibliothèques où sont des opérations assez coûteuses.



6
votes

Que diriez-vous des signaux de PBHOGAN:

https://github.com/pbhogan/signals

C'est super rapide (utilise le FASTDelegate code écrit par Don Clugston - Aussi mentionné par Ismael), et il est assez facile à utiliser. Je l'utilise depuis un certain temps et n'avait aucun problème.


5 commentaires

Je ne sais pas si cela importe ou non, mais cette implémentation n'est pas en sécurité.


@ERIC - C'est vrai, plus de travail devra être dépensé pour faire une version à fil-coffre-fort, et cela pourrait fonctionner mal.


Pas sûr de vous suivre. Si plus de travail serait nécessaire pour le faire filer en sécurité, il ne s'agit pas de fil de sécurité ... Je n'ai jamais déclaré que cela ne pouvait pas être fait du fil sûr. J'ai remarqué cette bibliothèque de votre message et quand je l'ai regardée, j'ai été très découragé par le méchant Modèle et la classe de délégués hackish. On dirait beaucoup de vaudeur au travail pour travailler autour des compilateurs de buggy pour descendre à deux lignes d'ASM. Je vais jouer avec cela pour voir mais cela hurle juste de déboguer du cauchemar pour moi.


@ERIC Désolé d'être incertain, je suis d'accord avec vous que cette bibliothèque n'est certainement pas très sûre. Si vous avez besoin d'une bibliothèque de signaux de fil de sécurité, celui-ci n'est pas pour vous, je suppose. J'ai utilisé cela sur un produit de production et je n'ai jamais eu de problèmes du tout. Je conviens que c'est un peu brut, et je m'attendais à beaucoup de problèmes, mais cela s'est bien passé. Chose est, c'est dang rapide. Vous sacrifiez quelques éléments pour obtenir cette vitesse (à savoir qu'il est syntaxiquement pas parfait). La chose est que l'OP n'a jamais nécessité une librairie de sécurité, donc c'était une réponse valide.


@ERIC - Boost Signals2 est un système de signal / emplacement entièrement sécurisé que j'ai aussi utilisé. C'est assez génial, mais il est moins efficace que l'approche minimale de la FastDelegate.