2012-02-10 22 views
11

Có ai có bất kỳ ý tưởng nào về hiệu suất tương đối của GAsyncQueue của GLib so với thông báo POSIX message_queue cho giao tiếp giữa các luồng không? Tôi sẽ có nhiều thông điệp nhỏ (cả một cách và các kiểu yêu cầu-đáp ứng), sẽ được thực hiện trong C trên đầu Linux (hiện tại; có thể được chuyển sang Windows sau). Tôi đang cố quyết định cái nào nên sử dụng.GAsyncQueue của GLib so với thông báo POSIX_queue

Điều tôi đã biết là sử dụng GLib tốt hơn cho mục đích di động, nhưng POSIX mq có lợi thế là có thể chọn hoặc thăm dò ý kiến ​​trên chúng.

Tuy nhiên, tôi chưa tìm thấy bất kỳ thông tin nào có hiệu suất tốt hơn.

Trả lời

14

Vì không có câu trả lời cho câu hỏi của tôi, nên tôi đã quyết định tự mình chạy một số bài kiểm tra hiệu suất. Ý tưởng chính được lấy từ http://cybertiggyr.com/throughput/throughput.html. Ý tưởng thử nghiệm là:

  • Tạo hai chủ đề (pthreads/gthreads).
  • Một luồng đã tạo dữ liệu và ghi vào IPC theo khối cho đến khi dữ liệu 1024 MB được gửi đi.
  • Chủ đề khác đã tiêu thụ dữ liệu từ IPC. Tôi đã thử nghiệm với kích thước chunk 4, 64, 256, 512 và 1024 byte. Tôi đã thử nghiệm với GAsyncQueue (với gthreads), hàng đợi tin nhắn POSIX và ổ cắm miền UNIX (với pthreads).

Đây là kết quả thu được:

enter image description here

Để tóm tắt, perf (GAsyncQueue)> Perf (mq)> Perf (UNIX socket), mặc dù các màn trình diễn của GAsyncQueue và POSIX hàng đợi thông điệp là so sánh trong hầu hết các trường hợp - sự khác biệt chỉ xảy ra với kích thước tin nhắn nhỏ.

Tôi đã tự hỏi GAsyncQueue được triển khai như thế nào để có thể so sánh hiệu suất tốt hơn so với triển khai hàng đợi thông điệp gốc của Linux. Thật đáng tiếc là nó không thể được sử dụng cho giao tiếp giữa các quá trình, giống như hai phương tiện khác có thể.

+1

Rất thú vị. Tôi đã upvoted câu trả lời và câu hỏi của bạn, có lẽ nó bây giờ sẽ cho phép bạn đăng các đồ thị. – kalev

+0

Tôi đã chạy một số thử nghiệm khác: thêm tín hiệu giữa các chuỗi để cho người tiêu dùng biết rằng dữ liệu đã được tạo. Tôi đã sử dụng kỹ thuật Linux eventfd. Và ngay sau khi tôi đã làm như vậy, tôi thấy hiệu suất của GAsyncQueue làm suy giảm để được tương tự như những người khác. – dbikash

+1

Điều này có giải thích các kết quả không? Đó là tất cả các cơ chế IPC Linux đi qua hạt nhân và do đó có hiệu suất tương tự. GAsyncQueue bằng cách nào đó đã thực hiện không gian người dùng - không gian người dùng bổ sung - sao chép không gian hạt nhân được tránh, dẫn đến hiệu suất tốt hơn. Và ngay sau khi cơ chế eventfd được thêm vào, một lần nữa hạt nhân đi vào hình ảnh. Sự hiểu biết đó có đúng không? – dbikash