Преобразование существующего кода в Span <T>, какой метод использовать? - PullRequest
1 голос
/ 12 марта 2020

Существующий код:

public class Header {
   public Header(byte[] data)
   {
      // fill up some properties from the data byte[].
      var subdata = new byte[16];
     this.F = new Foo(Array.Copy(data, 0, subdata, 0, 16));
   }

   public Foo F {get; set; }
}

Существующий код работает следующим образом:

BinaryReader br = ....
var h = new Header(br.ReadBytes(64));

Такое ощущение, что его можно оптимизировать с помощью Span.

Мой код теперь выглядит как:

public class Header {
   public Header(ReadOnlySpan<byte> data)
   {
      // fill up some properties from the data byte[].
     this.F = new Foo(data.Slice(0, 16));
   }

   public Foo F {get; set; }
}

Теперь, какой вариант я должен использовать и почему?

Оригинальный код:

BinaryReader br = ....
var h = new Header(br.ReadBytes(64));

Версия 1:

BinaryReader br = ....
var h = new Header(br.ReadBytes(64).AsSpan());

// I guess this is the same:
BinaryReader br = ....
Span<byte> buf = br.ReadBytes(64);
var h = new Header(buf);

Версия 2:

BinaryReader br = ....
Span<byte> buffer = new byte[64];
br.Read(buffer);
var h = new Header(buffer);

Версия 3:

BinaryReader br = ....
Span<byte> buffer = stackalloc byte[64];
br.Read(buffer);
var h = new Header(buffer);

Версия?: Что-нибудь еще?

...