2012-09-13 59 views
-1

可能重複:
boost::async_write takes too long升壓ASIO :: ASYNC_WRITE()花費的時間太長

在我的服務器應用程序,我在一個theread運行ASIO服務處理大約100個連接。我發現async_write()有時需要很長時間,大約15ms(數據包很小)

我的問題是爲什麼async_write()需要這麼長時間?我認爲async_write()應該立即返回。所以很難發送很多數據。我的意思是,函數不會立即返回。我不是說發送沒有立即完成。同步功能15ms太長。該應用程序真的被阻止。 (不關心的GetTickCount)

測試這樣的代碼:

uint64_t TStart = 0, TEnd = 0; 
TStart = GetTickCount(); 

async_write(*this->m_Socket, 
    boost::asio::buffer(pSendData->m_buf.GetBuffer(), pSendData->m_buf.GetSize()), 
    boost::bind(&SttSocketConnection::OnSended, this, 
    pSendData, placeholders::error, placeholders::bytes_transferred)); 

TEnd = GetTickCount(); 
if (TEnd - TStart > 1) { 
    __asm int 3; 
    TStart = TEnd; 
} 
+0

您希望異步函數能夠立即完成嗎?我想你不明白什麼是異步手段。 –

+0

我還沒有使用問題的提升功能,但通常情況下,異步寫入的同步部分應該非常快速地完成,除非有緩衝區大小限制,並且它會恢復爲同步操作。也許如果你對一個塊進行一些未完成寫入的測試,改變緩衝區大小的影響(如果可以的話)等,你會發現一個相關性。 –

+0

不要一直髮布相同的問題。如果你想明白爲什麼'async_write()'花費時間,那就問問。 –

回答

1

這聽起來像你的地方導致上下文切換。 15ms是多處理器Windows機器上的調度量程。

如果它不總是經常發生,不要擔心,當您進行系統調用時,您剛剛被上下文切換命中。

如果您在每次調用時都遇到問題,則應該按照系統調用進行操作,並找出哪一個會導致上下文切換。在使用IO完成端口,串行端口和小超時時,我看到了類似的問題,其中一些系統調用總是以15毫秒的延遲結束。爲了解決這個問題,我不得不重構代碼,以便異步操作的完成不涉及定時器。

我不確切地知道是什麼導致這個問題與asio。您應該關閉系統調用並找出哪一個會導致延遲。

+0

謝謝!我找到了這個地方。我只使用單線程來運行asio和消息循環。像這樣:while(!stoping){io.reset(); io.poll(); taskqueue.excute();}我刪除了io.reset(),一切正常。 – Cozyboy