2009-07-27 98 views
0

我有一個快速和骯髒的概念應用程序證明,我在C#中編寫,它從網絡讀取高數據速率多播UDP數據包。由於各種原因,完整的實現將用C++編寫,我正在考慮使用boost asio。 C#版本使用一個線程來使用阻塞讀取來接收數據。如果計算機負載過重(通常是在另一個線程中處理這些數據包),我在丟棄數據包時遇到了一些問題。Boost asio異步vs阻塞讀取,udp速度/質量

我想知道的是,如果在boost中使用async read操作(在Windows中使用重疊io)將有助於確保我接收數據包和/或減少接收數據包所需的CPU時間。單線程執行阻塞讀取操作非常簡單,使用異步讀取似乎複雜度有所提高,但我認爲如果在重負載系統上提供更高的性能或丟棄更少的數據包,這將是值得的。目前數據速率應不高於60Mb/s。

回答

0

我也寫過一些使用boost::asio的多播處理代碼。總的來說,根據我的經驗,在asio中執行某些操作會增加很多複雜性,這可能不會讓您與其他人合作來理解您最終編寫的代碼。

這就是說,大概贊成轉移到asio而不是使用大量不同的線程來完成這項工作的論點是,你將不得不做更少的上下文切換。在單核盒子上顯然是這樣,但是當你使用多核心時呢?您是否計劃將收到的工作卸載到線程中,或者只是讓一個線程執行處理工作?如果你採用單線程的方式,你將會面臨一種情況,你可能會丟棄等待該線程的數據包來處理工作。

最後它是擺動和迴旋處。我想說,如果你打算這樣做,你想要得到一些相當堅實的人物來支持你走下這條路的觀點,只是因爲它增加了所有複雜性(我確信一些人有一個全新的範例) )。

+0

這是一個可怕的答案... – snb 2017-06-22 17:01:25