2015-08-25 56 views
2

我開發了一個處理來自客戶端的許多連接的服務器應用程序。服務器定期向每個客戶端發送消息(例如:每1秒),檢查客戶端的到期時間(每個客戶端必須在連接時間達到預定值時強制與服務器斷開連接)以及其他一些定時器任務。我認爲2個解決方案:無限循環vs boost :: asio :: deadline_timer C++性能

  1. 使用,而(真){的foreach客戶{檢查時間}}
  2. 爲每一個客戶,delcare一個deadline_timer並呼籲async_wait每個任務,所以這將產生很多deadline_timer實例

哪種解決方案更適合性能?一般來說,我應該使用無限循環還是聲明多個計時器實例?還有一個,你能解釋OS如何管理deadline_timer嗎?

回答

2

問:哪種解決方案更適合性能?

無限循環通常不好。在具有線程相關性的CPU飽和工作人員中發現異常(但在此似乎不適用)。

問:一般情況下,我應該使用無限循環

沒有

問:或聲明多計時器實例?

或者只是

std::vector<boost::shared_ptr<asio::deadline_timer> > m_timers; 

或類似:)

問:還有一,你能解釋操作系統如何管理deadlien_timer?

定時器在引擎蓋下使用特定於平臺的內核事件。意思是,在實踐中,如果你有例如10個任務在不同的定時器上都被阻塞,內核會保持進程處於睡眠狀態(根本不運行),直到第一個過期。

到目前爲止,內核級同步基元通常是非CPU綁定工作負載的最快方式。

+0

,則需要創建deadline_timer實例的數量巨大。 deadline_timer實例的數量是否有限制? – Ikarus

+0

這將被實現定義。如果它的的確確是「鉅額」(見的Calvins回答),確實考慮「標記和清除」的方式,交易準確性資源使用情況和可能_average_(!)的IO速率 – sehe

1

您是否要求每個客戶端在完全(或接近)一秒時間內超時?

我會做第三條道路:

while (true) { 
    if (elapsed_one_second()) { 
    for each client { 
     client->check_timeout(); 
    } 
} 

或者,如果你有事件隊列,你做一個定時器觸發所有客戶端的檢查。

編輯: 如果你有大量的定時器,你也可以考慮實現一個增量隊列,併爲最早的事件使用一次性定時器。

+0

我想要的時間是相當準確的,所以這個解決方案不適合 – Ikarus

+0

在這種情況下,你可以做一個三角形隊列,並使用一個定時器,你對複雜的完全控制。 –

+0

我不知道三角形隊列,我會如果我的服務器處理成千上萬的併發客戶端(每個客戶端需要一些deadline_timer情況下)探討該解決方案後 – Ikarus

相關問題