Quale libreria di segnali / scanalature C ++ dovrei scegliere?

Voglio usare una libreria di segnali / slots in un progetto che non usa QT. Ho dei requisiti piuttosto elementari:

  1. Connetti due funzioni con qualsiasi numero di parametri.
  2. I segnali possono essere collegati a più slot.
  3. Scollegamento manuale della connessione segnale / slot.
  4. Prestazioni decenti: l’applicazione è basata su frame (ovvero non basata su eventi) e desidero utilizzare le connessioni in ciascun frame.

Ho letto un confronto tra libsigc ++ e Boost.Signals . Ho anche letto che Boost.Signals soffre di scarse prestazioni. Tuttavia, so che ci sono altre librerie e non sono ancora sicuro di quale libreria dovrei scegliere.

Ci sono raccomandazioni per una libreria di segnali / slot?

Per prima cosa, prova con boost :: signal comunque. Non dare per scontato che non sarà abbastanza veloce finché non proverai nel tuo caso specifico che è la tua applicazione

Se non è abbastanza efficiente, forse qualcosa come FastDelegate soddisferà le tue esigenze? (Non ho provato, ma ho sentito che era una buona soluzione in alcuni casi in cui boost: il segnale non sembra adatto).

Ad ogni modo, se nella tua applicazione usi il segnale per ogni fotogramma, potrebbe valere la pena sostituire il sistema di segnale con qualcosa di più semplice, come un contenitore che contiene oggetti / funtori che verranno chiamati ogni fotogramma. Il segnale è più fatto per consentire una gestione immediata degli “eventi” che per fare un ciclo ciclico dinamico (permettendo di cambiare le funzioni chiamate ogni fotogramma). (Ho la mia soluzione (UPDATE: è molto vecchia e arcaica ora) che uso pesantemente in un gioco e per esempio non ho problemi con le prestazioni, quindi forse qualcosa di simile potrebbe aiutare).

Libreria di eventi molto, molto veloce su moduli di Gamedev.net

Durante la profilazione di un codice su cui stavo lavorando di recente, sono rimasto sorpreso e sgomentato dal vedere le funzioni boost :: signals fluttuare in alto. Per quelli di voi che non sono consapevoli, boost :: signals è una libreria di segnale / slot meravigliosamente utile che può essere utilizzata insieme a boost :: bind per la gestione degli eventi basata sui delegati, come si vede in C #. È robusto, pieno di funzionalità e flessibile. È anche, ho imparato, incredibilmente, terrificantemente lento. Per molte persone che usano boost: i segnali vanno bene perché chiamano gli eventi molto raramente. Stavo chiamando diversi eventi per frame per object, con risultati prevedibili.

Così ho scritto il mio. Leggermente meno flessibile e ricco di funzionalità. È ottimizzato per il modo in cui tutti tendono a utilizzare effettivamente gli eventi. E l’invocazione dell’evento è da quindici a ottanta volte più veloce di boost :: signals.

vedi link

I due che hai elencato sono gli unici due per cui ne valga la pena. Tutto ciò che ho visto ha mostrato che libsigc ++ ha le migliori prestazioni. Come hai visto nel confronto, ci sono alcuni casi in cui la syntax di boost è un po ‘più carina, ma solo un po’.

Ho usato personalmente libsigc ++ e ne sono felice. Libsigc ++ sembra essere usato da molti più progetti. Un rapido sguardo nel mio gestore di pacchetti elenca più di 100 progetti dipendenti da libsigc ++ 2. Questo da solo è abbastanza secondo me per bilanciare l’equilibrio soprattutto considerando il vantaggio prestazionale e la mancanza di altre differenze significative.

Dico libsigc ++ 2.

Di recente ho ereditato un progetto in cui la connect stava producendo un sovraccarico eccessivo per i nostri obiettivi del progetto. La profilazione ha rivelato l’uso di un mutex nel segnale, che non era necessario dato il nostro utilizzo del segnale. Sostituito con un mutex fittizio per la documentazione con successo. Il mutex è “drasticamente più lento”, quindi assicurati di averne bisogno. Questo può essere utile per gli altri che sfiorano questo post.

typedef boost::signals2::signal_type::type signal_type; originale typedef boost::signals2::signal_type::type signal_type;

Nuovo typedef boost::signals2::signal_type >::type signal_type;

Voterò per Sigslots , ho provato un paio di altre alternative (boost, libsig ++, FastDelegates) e nessuno sembrava fare proprio quello che volevo: il binding funziona in modo anonimo con la disconnessione automatica on-object-destruction.

Sigslots è stato fantastico per noi perché è perfettamente leggibile in C ++, è veloce, semplice e fa il lavoro senza intralciarlo. Una cosa minore, se vuoi usarla da diverse librerie potresti aver bisogno di aggiungere:

 COREEXTERN template class COREIMPEXP has_slots; 

per evitare problemi di collegamento relativi all’object già definiti.

Ho usato libsigc ++ in precedenza ed è stato abbastanza semplice. Non penso che avrebbe molto da penalizzare in termini di prestazioni, e in effetti ho imparato ad apprezzare l’utilizzo di slot invece di puntatori di funzione in alcuni punti.

Una cosa di cui essere a conoscenza era che l’ultima volta che l’ho usato (più di 2 anni fa), era limitato a un massimo di sei parametri passati attraverso le connessioni.

Non ho alcuna esperienza con la libreria boost, quindi non posso aiutarti.

Ho usato la libreria boost signal2, ed è molto lento. Sulla costruzione dell’object con segnali di boost, il tempo del processore del 99% consumato dallo stack dei segnali di boost. Sui segnali emettono con un solo slot simle ha anche un overhead molto grande. Provo libsigc ++ ed è molto più veloce. Libsigc ++ sembra essere molto veloce e flessibile Creazione di 40000 oggetti con 9 segnali boost e 9 segnali libsigc ++:

Non ho usato libsig ++ ma ho letto su di esso. La mia precedente esperienza con segnali e slot proviene da Qt e un po ‘da Boost. Se non si dispone di nessuno dei due disponibili, è ansible provare la mia libreria di segnali e slot (ksignals) che esiste sia per il codice incorporato (nessuna allocazione dynamic della memoria) che per il codice c ++ “normale” (allocazione dynamic della memoria durante la connessione).

Puoi trovarlo su: http://www.kjellkod.cc/signalandslots

Nella pagina è anche ansible trovare un confronto: segnali KSignals Vs Boost.

Speed ​​vise ksignals è un codice molto veloce ed estremamente leggero. Dovrebbe essere molto facile da usare, capire e, se necessario, modificarlo.

Buona fortuna Saluti Kjell H

Un’altra implementazione di sig-slot da considerare:

http://code.google.com/p/ting/wiki/SignalSlotUsage

Non pretende di essere il migliore, ma, ancora, un altro che ha il diritto di esistere.

Un’altra opzione può essere YSignalSlot . L’ho usato. Penso che sia abbastanza buono.

Che dire di questa implementazione alternativa che sembra buona: http://endl.ch/content/fastsig ?