C#で、非同期ソケット(TCP)を扱う場合、

  • BeginXXXのメソッドを使うパターン
  • SocketAsyncEventArgsクラスを使うパターン

の2つがあるようです。

使われているシステムコールに差異があるのかと思い、linux上の.NET5で試してみたところ、

straceのログには、両方ともepollのシステムコールが使われていました。

というわけで、両方とも、linux上で使う場合は、IO性能の差はほぼなさそうです。

では、何が違うのかというと、

BeginXXXのメソッドのコールバックでは、

IAsyncResultオブジェクトのアロケーションが、ソケット操作のたびに行われるのに対し、

SocketAsyncEventArgsは、接続ごとにアロケーションをする(つまり1クライアント1オブジェクト)形にすることで、

処理軽減を図っているのではないかと思われます。

(SocketAsyncEventArgsの公式ドキュメント)

https://docs.microsoft.com/ja-jp/dotnet/api/system.net.sockets.socketasynceventargs?redirectedfrom=MSDN&view=net-6.0

IAsyncResultオブジェクトで、接続先クライアントの情報もあれもこれも含めて渡す方法は悪くないが、

accept/readのインターフェースを統一しようとしていたのか、やはり無駄なように思える。

とはいえ、SocketAsyncEventArgsも初見では理解が難しい気もする。

なので、このあたりをラップしたライブラリを作っておいたほうがいい気がしている。

以上

コメントがあればどうぞ


CAPTCHA Image
Reload Image