先日、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してよいかどうかは悩ましいところだが・・・。