2012-02-10 13 views
11

Czy ktoś ma pojęcia o względnej wydajności GAsyncQueue GLib w porównaniu z POSIX message_queue dla komunikacji między wątkami? Będę miał wiele małych komunikatów (zarówno w jednym, jak i w trybie odpowiedzi na żądanie), które będą implementowane w języku C na Linuksie (na razie można je później przenieść do systemu Windows). Próbuję zdecydować, którego użyć.GAsyncQueue GLib vs POSIX message_queue

To, co odkryłem, to że używanie GLib jest lepsze dla celów przenośności, ale POSIX mq ma tę zaletę, że może je wybrać lub sondować.

Jednak nie znalazłem żadnych informacji o tym, czyj wydajność jest lepsza.

Odpowiedz

14

Ponieważ nie było odpowiedzi na moje pytanie, postanowiłem sam przeprowadzić testy wydajności. Główny pomysł został zaczerpnięty z http://cybertiggyr.com/throughput/throughput.html. Pomysł testu był następujący:

  • Utwórz dwa wątki (pthreads/gthreads).
  • Jeden wątek wygenerował dane i napisał do IPC w porcjach, aż do wysłania 1024 MB danych.
  • Drugi wątek pochłonął dane z IPC. Testowałem z rozmiarami 4, 64, 256, 512 i 1024 bajtów. Testowałem z GAsyncQueue (z gthreads), kolejką wiadomości POSIX i gniazdami domeny UNIX (z pthreads).

Oto wynik otrzymano:

enter image description here

Podsumowując, perfum (GAsyncQueue)> perf (MQ)> perf (gniazdo UNIX), chociaż występy GAsyncQueue i POSIX kolejce komunikatów są porównywalne w większości przypadków - różnica występuje tylko w przypadku małych rozmiarów wiadomości.

Zastanawiam się, w jaki sposób zaimplementowano GAsyncQueue, aby zapewnić porównywalną jeszcze lepszą wydajność niż implementacja natywnej kolejki komunikatów systemu Linux. Szkoda, że ​​nie można go używać do komunikacji między procesami, tak jak dwie pozostałe.

+1

Bardzo interesujące. Przegrałem twoją odpowiedź i pytanie, być może teraz pozwoli ci opublikować wykresy. – kalev

+0

Przeprowadziłem kilka dodatkowych eksperymentów: dodałem sygnalizację między wątkami, aby poinformować konsumenta, że ​​dane zostały wyprodukowane. Użyłem techniki eventfd Linux. I tak szybko, jak to zrobiłem, zobaczyłem, że działanie GAsyncQueue pogarsza się, aby być podobnym do innych. – dbikash

+1

Czy daje to wyjaśnienie wyników? Wszystkie mechanizmy IPC linuxa przechodzą przez jądro i dlatego mają podobną wydajność. GAsyncQueue ma w jakiś sposób implementację przestrzeni użytkownika - dodatkowa przestrzeń użytkownika - zapobiega kopiowaniu przestrzeni jądra, co skutkuje lepszą wydajnością. I zaraz po dodaniu mechanizmu eventfd ponownie pojawia się jądro. Czy to zrozumienie jest poprawne? – dbikash

Powiązane problemy