c++ boost signals-slots

¿Qué biblioteca de señales/ranuras C++ debo elegir?



boost signals-slots (11)

Quiero usar una biblioteca de señales / ranuras en un proyecto que no utiliza QT. Tengo requisitos bastante básicos:

  1. Conecte dos funciones con cualquier cantidad de parámetros.
  2. Las señales se pueden conectar a múltiples ranuras.
  3. Desconexión manual de la conexión señal / ranura.
  4. Buen rendimiento: la aplicación está basada en marcos (es decir, no basada en eventos) y quiero usar las conexiones en cada cuadro.

He leído una comparación entre libsigc ++ y Boost.Signals . También he leído que Boost.Signals sufre un bajo rendimiento. Sin embargo, sé que hay otras bibliotecas y todavía no estoy seguro de qué biblioteca debería elegir.

¿Hay alguna recomendación para una biblioteca de señales / ranuras?



En primer lugar, intente con la señal boost :: de todos modos. No suponga que no será lo suficientemente rápido hasta que intente en su caso específico que es su aplicación

Si no es lo suficientemente eficiente, tal vez algo como FastDelegate se adapte a sus necesidades? (No lo intenté pero escuché que era una buena solución en algunos casos donde boost :: signal no parece adecuarse).

De todos modos, si en su aplicación utiliza la señal de cada cuadro, puede valer la pena reemplazar el sistema de señal por algo más simple, como un contenedor que contenga objetos / funtores que se denominará cada cuadro. La señal está más hecha para permitir la administración inmediata de "eventos" que para hacer un ciclo de ciclo dinámico (lo que permite cambiar las funciones llamadas cada cuadro). (Tengo mi propia solución (ACTUALIZACIÓN: es muy antigua y arcaica ahora) que uso mucho en un juego y, por ejemplo, no tengo ningún problema con el rendimiento, así que tal vez algo similar podría ayudar).


He usado la biblioteca boost signals2, y es muy lenta. En la construcción del objeto con señales de refuerzo, el 99% del tiempo de procesador consumido por la pila de señales de refuerzo. En las señales que emiten con una sola ranura simle también tenía una sobrecarga muy grande. Intento libsigc ++ y es significativamente más rápido. Libsigc ++ parece ser una creación muy rápida y flexible de 40000 objetos con 9 señales de impulso y 9 señales de libsigc ++:


He usado libsigc ++ antes, y fue bastante sencillo. No creo que tenga mucho en el camino de las sanciones de rendimiento, y de hecho aprendí a gustar el uso de ranuras en lugar de punteros a las funciones en algunos lugares.

Una cosa a tener en cuenta es que, desde la última vez que lo usé (hace más de 2 años), se limitaba a un máximo de seis parámetros que se pasaban a través de las conexiones.

No tengo ninguna experiencia con la biblioteca de impulso, así que no puedo ayudarte allí.


Los dos que enumeró son los dos únicos que vale la pena conocer. Todo lo que he visto ha demostrado que libsigc ++ está en el mejor rendimiento. Como viste en la comparación, hay algunos casos en los que la sintaxis de boost es un poco más bonita, pero solo un poco.

Personalmente, he usado libsigc ++ y estoy contento con él. Libsigc ++ parece ser utilizado por muchos más proyectos. Una mirada rápida en mi administrador de paquetes enumera más de 100 proyectos que dependen de libsigc ++ 2. Eso solo es suficiente en mi opinión para inclinar la balanza, especialmente teniendo en cuenta la ventaja de rendimiento y la falta de otras diferencias significativas.

Yo digo libsigc ++ 2.


No he usado libsig ++ pero he leído sobre él. Mi experiencia previa con señales y ranuras es de Qt y un poco de Boost. Si no tiene ninguno de ellos disponible, puede probar mi propia biblioteca de señales y ranuras (ksignals) que existen tanto para código incrustado (sin asignación dinámica de memoria) como para código c ++ "normal" (asignación dinámica de memoria al conectarse).

Puede encontrarlo en: www.kjellkod.cc/signalandslots

En la página también puede encontrar una comparación: Señales KSignals Vs Boost.

Speed ​​vise ksignals es muy rápido y muy ligero en cuanto al código. Debe ser muy fácil de usar, comprender y, si es necesario, modificarlo.

Buena suerte Saludos Kjell H


Otra opción puede ser YSignalSlot . Lo usé. Creo que es bastante bueno.


Recientemente heredó un proyecto en el que connect producía demasiados gastos generales para los objetivos de nuestro proyecto. El perfilado reveló el uso de un mutex en la señal, que no era necesario dado nuestro uso de señal. Reemplazado con un mutex falso por la documentation con éxito. El mutex es "drásticamente más lento", así que asegúrese de que lo necesita. Esto puede ser útil para otros que roban esta publicación.

Original typedef boost::signals2::signal_type<void()>::type signal_type;

New typedef boost::signals2::signal_type<void(), boost::signals2::keywords::mutex_type<boost::signals2::dummy_mutex> >::type signal_type;



Yo votaría por Sigslots , Sigslots de las otras alternativas (boost, libsig ++, FastDelegates) y ninguna parecía hacer exactamente lo que quería: enlazar funciones de forma anónima con la desconexión automática de destrucción de objetos.

Sigslots fue genial para nosotros porque es perfectamente legible en C ++, es rápido, simple y hace el trabajo sin interponerse en el camino. Algo menor, si quiere usarlo de varias bibliotecas, puede que necesite agregar:

COREEXTERN template class COREIMPEXP has_slots<SIGSLOT_DEFAULT_MT_POLICY>;

para evitar problemas de enlaces relacionados con objetos ya definidos.


Biblioteca de eventos muy, muy rápida en formularios Gamedev.net

Cuando perfilaba un código en el que había estado trabajando recientemente, me sorprendió y me consternó que las funciones de boost :: signals flotaran hacia la cima. Para aquellos de ustedes que no lo saben, boost :: signals es una biblioteca de señal / ranura maravillosamente útil que se puede utilizar junto con boost :: bind para el manejo de eventos basado en delegados, como uno ve en C #. Es robusto, funcional y flexible. También es, lo he aprendido, increíblemente, terriblemente lento. Para mucha gente que usa señales boost :: esto está bien porque llaman eventos muy raramente. Llamaba varios eventos por cuadro por objeto, con resultados predecibles.

Así que escribí el mío. Ligeramente menos flexible y funcional. Está optimizado para la forma en que todos tienden a usar eventos. Y la invocación de eventos es de quince a ochenta veces más rápida que las señales boost ::.

ver enlace