Spanって速いのね

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が速い。
びっくりです。

投稿日:
カテゴリー: C#

コメントする

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