バッファーはArrayPoolから

先日、BitflyerのWebSocketのサンプルを上げたが、バッファーを・・・

var incomingData = new byte[8192];

とまあ、普通にnewしてた。

その後、いろいろ調べていて・・・

ようするに、今どきnew byte[]なんてしたら殺されるぞ!

http://neue.cc/2019/05/27_578.html

やばい、殺される。うへー

とりあえず、直すしかない。

※以下のプログラムは後日改定版が出ています。こちら

while (true)
{
    if (clientWebSocket.State != System.Net.WebSockets.WebSocketState.Open) { break; }

    var incomingData = System.Buffers.ArrayPool<byte>.Shared.Rent(8192);
    try {
        var result = await clientWebSocket.ReceiveAsync(new ArraySegment<byte>(incomingData), CancellationToken.None);
        if (result.Count > 0)
        {
            // incomingData , result.Countを使って何かする
        }
    }
    finally
    {
        System.Buffers.ArrayPool<byte>.Shared.Return(incomingData);
    }
}

こんなところかな。

※2021/10/28 追記
1024byteくらいまでの配列だと、素直にベンチマークを取ると、newでバッファーを確保した方が速かった。
もちろん、GCは速度が読みにくい面もあるので、単純に速いからnewしてよいかどうかは悩ましいところだが・・・。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です