Какую библиотеку сигналов / слотов C ++ выбрать? - PullRequest
37 голосов
/ 11 декабря 2008

Я хочу использовать библиотеку сигналов / слотов в проекте, который не использует QT. У меня довольно простые требования:

  1. Соединение двух функций с любым количеством параметров.
  2. Сигналы могут быть подключены к нескольким слотам.
  3. Ручное отключение соединения сигнал / слот.
  4. Достойная производительность - приложение основано на фреймах (т.е. не на основе событий), и я хочу использовать соединения в каждом фрейме.

Я прочитал сравнение между libsigc ++ и Boost.Signals . Я также читал, что Boost.Signals страдает от низкой производительности. Однако я знаю, что есть другие библиотеки, и я до сих пор не уверен, какую библиотеку выбрать.

Есть ли какие-либо рекомендации для библиотеки сигналов / слотов?

Ответы [ 11 ]

17 голосов
/ 14 декабря 2008

Во-первых, попробуйте в любом случае с boost :: signal. Не думайте, что это не будет достаточно быстро, пока вы не попробуете в вашем конкретном случае, которое является вашим приложением

Если это недостаточно эффективно, возможно, что-то вроде FastDelegate подойдет вашим потребностям? (Я не пробовал, но слышал, что это было хорошим решением в некоторых случаях, когда boost :: signal не подходит).

В любом случае, если в вашем приложении используется сигнал для каждого кадра, возможно, стоит заменить сигнальную систему на что-то более простое, например контейнер, содержащий объекты / функторы, которые будут называться в каждом кадре. Сигнал больше предназначен для немедленного управления «событиями», чем для динамического цикла цикла (позволяющего изменять функции, называемые каждым кадром). (У меня есть мое собственное решение (ОБНОВЛЕНИЕ: сейчас оно очень старое и устаревшее), которое я активно использую в игре, и, например, у меня нет проблем с производительностью, поэтому, возможно, что-то подобное может помочь).

14 голосов
/ 12 сентября 2009

Очень, очень быстрая библиотека событий в формах Gamedev.net

При профилировании некоторого кода я был работая над недавно, я был удивлен и встревожен, чтобы увидеть повышение :: сигналы функции, плавающие на вершину. За те из вас, кто не знает, Boost :: сигналы очень полезно библиотека сигналов / слотов, которую можно использовать наряду с повышением :: связать для обработка событий на основе делегатов, такая как каждый видит в C #. Это надежно, многофункциональный и гибкий. Это также, Я узнал, невероятно, ужасно медленно Для многих людей кто использует boost :: сигналы это нормально потому что они называют события очень редко. Я звонил несколько событий за кадр за объект, с предсказуемыми результатами.

Так что я написал свой. Поменьше гибкий и многофункциональный. Это оптимизирован для того, как все стремятся на самом деле использовать события. И событие вызов от пятнадцати до восьмидесяти раз быстрее, чем наддува :: сигналы.

см. Ссылку

5 голосов
/ 28 августа 2014

Недавно унаследовал проект, в котором connect производил слишком много накладных расходов для целей нашего проекта. Профилирование показало использование мьютекса в сигнале, которое было ненужным, учитывая наше использование сигнала. Заменено на фиктивный мьютекс согласно документации с успехом. Мьютекс "значительно медленнее", поэтому убедитесь, что он вам нужен. Это может быть полезно для других, просматривающих этот пост.

Оригинальный typedef boost::signals2::signal_type<void()>::type signal_type;

Новый typedef boost::signals2::signal_type<void(), boost::signals2::keywords::mutex_type<boost::signals2::dummy_mutex> >::type signal_type;

5 голосов
/ 12 сентября 2009

Двое из тех, кого вы перечислили, являются единственными, которые мне известны. Все, что я видел, показало, что libsigc ++ работает с максимальной производительностью. Как вы видели в сравнении, есть некоторые случаи, когда синтаксис boost немного красивее, но немного.

Я лично использовал libsigc ++ и доволен этим. Libsigc ++, похоже, используется гораздо большим количеством проектов. Беглый взгляд в моем менеджере пакетов перечисляет более 100 проектов, зависящих от libsigc ++ 2. На мой взгляд, этого достаточно, чтобы изменить баланс, особенно с учетом преимущества в производительности и отсутствия других существенных различий.

Я говорю libsigc ++ 2.

4 голосов
/ 30 декабря 2010

Я бы проголосовал за Sigslots , я попробовал несколько других альтернатив (boost, libsig ++, FastDelegates), и ни одна из них, похоже, не сделала просто , что я хотел: связывание функций вместе анонимным способом с автоматическим отключением при уничтожении объекта.

Sigslots отлично подошли для нас, потому что это отлично читаемый C ++, он быстрый, простой и выполняет свою работу, не мешая. Одна небольшая вещь, если вы хотите использовать его из нескольких библиотек, вам может потребоваться добавить:

COREEXTERN template class COREIMPEXP has_slots<SIGSLOT_DEFAULT_MT_POLICY>;

, чтобы избежать проблем связывания с уже определенными объектами.

3 голосов
/ 08 декабря 2013

Я использовал библиотеку boost сигналов2, и она очень медленная. На строительство объекта с сигналами буста, 99% процессорного времени расходуется стеком сигналов буста. По сигналам, излучаемым одним слотом simle, накладные расходы были очень большими. Я пытаюсь libsigc ++, и это значительно быстрее. Libsigc ++ кажется очень быстрым и гибким Создание 40000 объектов с 9 сигналами повышения и 9 сигналами libsigc ++:

3 голосов
/ 11 декабря 2008

Я использовал libsigc ++ раньше, и это было довольно просто. Я не думаю, что это сильно повлияло бы на снижение производительности, и действительно я научился любить использовать слоты вместо указателей на функции в некоторых местах.

Одна вещь, о которой следует знать, это то, что с момента моего последнего использования (2+ года назад) он был ограничен максимум шестью параметрами, передаваемыми через соединения.

У меня нет опыта работы с буст-библиотекой, поэтому я не могу вам помочь.

1 голос
/ 11 марта 2010

Еще одна реализация sig-slot:

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

Он не претендует на звание лучшего, но, тем не менее, еще один, имеющий право на существование.

1 голос
/ 07 января 2010

Я не использовал libsig ++, но я прочитал об этом. Мой предыдущий опыт работы с сигналами и слотами был от Qt и немного от Boost. Если у вас нет ни одного из них, вы можете попробовать мою собственную библиотеку сигналов и слотов (ksignals), которая существует как для встроенного кода (без динамического выделения памяти), так и для «нормального» кода C ++ (динамическое распределение памяти при подключении).

Вы можете найти его по адресу: www.kjellkod.cc/signalandslots

На странице вы также можете найти сравнение: KSignals Vs Boost сигналы.

Speed ​​vise ksignals - очень быстрый и очень легкий код. Он должен быть очень простым в использовании, понимании и при необходимости его модифицировать.

Удачи С уважением Кьелл Н

0 голосов
/ 26 ноября 2014

Как насчет этой альтернативной реализации, которая выглядит хорошо: http://endl.ch/content/fastsig?

...