2017-11-16 11 views
4

Webアプリケーションがあり、GCの負荷を軽減し、パフォーマンスを向上させるために、新しいSpan<T>タイプを使用したいとします。Span <T>によってどのような一般的な操作を効率化できますか?

どのパターンを調べる必要がありますか?この新しい機能を実装する際に.NETチームが念頭に置いた典型的な操作はありますか?

+3

https://blogs.msdn.microsoft.com/dotnet/2017/11/15/welcome-to-c-7-2-and-span/またはhttp://adamsitnik.com/Span/興味を持っている。 – mjwills

+1

[MSDNマガジン:C#7.2:スパンビデオの理解](https://channel9.msdn.com/Events/Connect/2017/T125) –

+0

APIを簡略化することができれば何でも。私はベクトル/行列演算をたくさん行い、記憶装置を共通化することに興奮しています。現在、私は管理対象でない(固定された)ポイントと管理された配列を格納するために異なるクラスを持っています。 – ja72

答えて

2

この前のC#7.2の実装を参照して、一例としてあり、この新しいクラスとインフラを助けることができる非常にいくつかの例がありますが、彼らは共通している場合は、コードに依存して...

static void Main(string[] args) 
{ 
    byte[] file = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; 
    byte[] header = file.Take(4).ToArray(); 
    byte[] content = file.Skip(4).ToArray(); 

    bool isValid = IsValidHeader(header); 
} 

private static bool IsValidHeader(byte[] header) 
{ 
    return header[0] == 0 && header[1] == 1; 
} 

file.Take(4).ToArray()byte[] content = file.Skip(4).ToArray();が問題です。バイト配列の2つの部分を分割するだけの新しい配列を作成する必要があります。バイト配列のサイズの場合、パフォーマンスとメモリ使用量に影響を与えると想像できます(10 MB fileの配列を想像すると、突然メモリに20 MBがかかります)。ここを複製せずに、配列、内のデータを使用することが可能となる

static void Main(string[] args) 
{ 
    byte[] file = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; 
    var header = file.Take(4); 
    var content = file.Skip(4); 

    bool isValid = IsValidHeader(header); 
} 

private static bool IsValidHeader(ReadOnlySpan<byte> header) 
{ 
    return header[0] == 0 && header[1] == 1; 
} 

ReadOnlySpan<T>Span<T>インフラストラクチャの一部)を使用して:

は今C#7.2の実装を参照してください!メモリの圧力はまだ10MBです。配列は複製されません。また、配列、リスト、ストリームリーダーの両方でSpan<T>を使用しているので、すべてのソースに対して共通のメソッドを構築できます。

もちろん、これはIEnumerable<T>でも実装できましたが、このパフォーマンスは非常に優れています(例えば、content変数を繰り返し使用すると、無限にスキップすることはありません)。

関連する問題