2012-06-04 45 views
2

我正在寫支持大量(50,000+)連接的tcp服務器,並且我發現了這個問題。套接字同步發送優於異步beginsend/endsend?

同步發送至少比異步發送執行3次。這些方案除了這兩個行相同:

m_socket.Send(sendingBuffer, length, SocketFlags.None); 

m_socket.BeginSend(sendingBuffer, 0, length, 0, new AsyncCallback(SendCallback), this); 

在SendCallback我只是叫EndSend,沒有別的。

這個巨大的性能差異來自哪裏?不是異步方法應該表現得更好?

+0

您是否嘗試了SendAsync API?這實際上可以是同步或異步(返回值告訴你它使用了哪個)。 SendAsync API是我用於我們的websockets服務器的地方,它處理類似的流量。 –

+0

快3倍做什麼?您要傳輸多少數據?乞丐相信,兩者最終都不是網絡約束而不是CPU約束的。 – EJP

+0

正在發送。這是一個非常簡單的中繼服務器向連接的對等點轉發請求。 – jjofseattle

回答

3

異步方法通常是然後同步方法(由於涉及實施一些額外的開銷),但總的「快」,如果你需要做的事情他們正在執行 - 如果你只是等待他們完成,他們完全沒有必要。

+0

這就是我想象的。如果我可以保證發送緩衝區未滿,並且我的發送不會被tcp發送窗口阻止,那麼同步發送是更好的選擇。 – jjofseattle

+1

異步變慢本身就是一個被忽略的關鍵點!我可以從我自己的基準確認這個觀察。 – usr