我正在寫一個異步日誌記錄框架,我有多個線程轉儲數據。我開始玩Boost asio,因爲它提供了一些簡單的方法來執行序列化和訂購。因爲我是初學者,所以我開始使用線程安全(使用boost::mutex
和boost:condition_variable
)circular bounded_buffer(實際上是vector)的設計。Boost ASIO IO_SERVICE實現?
我寫了一個簡單的基準來測量性能。基準測試只是一個記錄一百萬條消息的單線程(將它推入緩衝區),而我的工作線程只會從隊列中獲取消息以登錄到文件/控制檯/記錄器列表。 (P.S.使用互斥體和C.V是正確的,消息的指針正在移動,所以從這個角度來看,一切都很好/有效)。
當我改變了我的執行,而不是使用boost::asio::io_service
和和具有單個線程執行run()
性能確實提高了(其實它真的縮放以及對增加在我最初的簡單模型,而不是降低性能正在記錄的信息的數量)
這裏有幾個問題,我想清除。
爲什麼要提高性能? (我認爲
boost::asio::io_service
內部實現具有處理程序的線程安全隊列,這使得它比我自己的初始簡單線程安全隊列設計更有效率)。請注意,我的設計經過了充分的審查,沒有出現任何錯誤(骨架代碼基於已證明的示例),是否有人可以更詳細地瞭解io_service
如何實現此目的的內部細節。第二個有趣的觀察是,在增加線程時,我的初始實現性能得到了改善,但是以丟失序列化/排序爲代價,但性能隨boost :: asio降低(非常輕微)(我認爲這是因爲我的處理程序做了非常簡單的任務,並且上下文切換開銷正在下降,我會嘗試執行更復雜的任務並在稍後發佈我的觀察結果)。我真的很想知道
boost::asio
只是用於I/O和網絡操作,還是我用它來通過線程池執行並行任務(並行)是一種很好的設計方法。io_service
對象只是用於I/O對象(如文檔中所寫),但我發現它是一種非常有趣的方式,可以幫助我以序列化的方式解決併發任務(不僅僅是I/O或與網絡相關的任務)使用股線進行排序)。我很興奮,並且很好奇爲什麼基本模型沒有執行/縮放以及當我使用boost asio。
結果:(在我剛1個工作線程)
- 1000任務:在這兩種情況下 10微秒/任務
- 10000任務:80微秒(有界緩衝液),在升壓10微秒ASIO
- 100000任務:250微秒(bounde緩衝液),在升壓10微秒ASIO
這將是有趣到k現在如何提升解決線程安全問題io_service
處理程序的線程安全隊列(我總是認爲在某種程度上的實現,他們也必須使用鎖和c.v)。
我已經使用'boost :: asio'來管理其他類型的異步任務(不僅僅是網絡IO)以取得良好的成功。 – Chad 2012-03-20 15:13:00
我知道這是一個老問題,但可能(在Windows上),ASIO使用IO完成端口,這可能會導致總體系統調用較少。 – Pete 2013-10-22 08:21:09