C#のSpanが優秀だと聞くので、ちょっと試してみた。
BenchmarkDotNetを使って、速度を比較してみた。
byte[5]からbyte[50]に、10回ループしてデータをコピーしてみた。
違いは、byte[]のメソッドで以下のどっちを使うかだけ。
CopyTo(Array array,int index)
CopyTo<byte>(Span<byte> destination)
コードはこちら
static byte[] data = new byte[5] { 15, 16, 17, 18, 19, };
[Benchmark]
public byte[] CopyArray()
{
var result = new byte[50];
for (int i = 0; i < 10; i++)
{
data.CopyTo(result, i * 5);
}
return result;
}
[Benchmark]
public byte[] CopySpan()
{
var result = new byte[50];
for (int i = 0; i < 10; i++)
{
data.CopyTo(result.AsSpan(i * 5));
}
return result;
}
結果はこちら
| Method | Mean | Error | StdDev |
|---------- |---------:|---------:|---------:|
| CopyArray | 88.49 ns | 1.007 ns | 0.942 ns |
| CopySpan | 41.33 ns | 0.812 ns | 0.720 ns |
さすがに、byte[]みたいなシンプルなのだと変わらないかと想定していたのに、結果は2倍くらいSpanが速い。
びっくりです。