GLib GAsyncQueue против POSIX message_queue

Кто-нибудь имеет представление об относительной производительности GLib GAsyncQueue или POSIX message_queue для межпоточной связи? У меня будет много небольших сообщений (как односторонних, так и типов запросов-ответов), которые будут реализованы в C поверх Linux (на данный момент их можно портировать на Windows позже). Я пытаюсь решить, какой из них использовать.

То, что я выяснил, заключается в том, что использование GLib лучше для целей переносимости, но POSIX mq имеет то преимущество, что они могут выбирать или опросить их.

Однако я не нашел никакой информации о том, чья производительность лучше.

Ответ 1

Поскольку ответов на мой вопрос не было, я решил самостоятельно выполнить некоторые тесты производительности. Основная идея была взята из http://cybertiggyr.com/throughput/throughput.html. Идея теста заключалась в следующем:

  • Создайте два потока (pthreads/gthreads).
  • Один поток создал данные и написал IPC в кусках, пока не было отправлено 1024 МБ данных.
  • Другая нить потребляет данные от IPC. Я тестировал с размерами блоков 4, 64, 256, 512 и 1024 байта. Я тестировал с GAsyncQueue (с gthreads), очередью сообщений POSIX и сокетами домена UNIX (с pthreads).

Вот результат:

enter image description here

Подводя итог, perf (GAsyncQueue) > perf (mq) > perf (сокет UNIX), хотя показатели очереди сообщений GAsyncQueue и POSIX в большинстве случаев сопоставимы - разница происходит только с небольшими размерами сообщений.

Мне было интересно, как GAsyncQueue реализована, чтобы обеспечить сопоставимую производительность даже по сравнению с реализацией очереди сообщений Linux. Жаль, что он не может использоваться для межпроцессного общения, как это делают другие два.