CSharpでTCP Serverを実装するためのアプローチが複数提供される中で、現時点ではawait/asyncのモデルがパフォーマンスとメンテナンスの両面おいて優れていると聞く
それが「どの程度」優れているかを調査する
- await/asyncを使った非同期モデル(非同期TcpClient)
- BeginRecieve()などを使った非同期モデル(非同期Socket)
- ThreadPoolを使った同期的モデル(同期ThreadPool)
同時接続数 : 1,000接続 パケット本体 : 1,000byte 1接続辺りリクエスト数 : 1,00回 CPU : Core i7 3770 Memory: 16G OS : Windows 7
実装方法 | 行数 | 難易度 | 秒間リクエスト数 |
---|---|---|---|
async/await | 101 | 易しい | 56,916 |
非同期ソケット | 170 | 難しい | 68,272 |
ThreadPool | 97 | 易しい | 51,129 |
- ThreadPoolはThreadPool.SetMinThreads()でworkerスレッドを同時接続数と同等程度に設定しないと上記の性能が出ない
- async/awaitは予想よりも遅い、特に非同期ソケットと比べると有意な差が見られる