Span<T>とMemory<T>は、連続メモリ(配列、文字列、バッファ)を効率的に操作するための最新の.NETの型です。アロケーションやコピーなしで既存メモリへのビューを提供することで、高パフォーマンスなコードを実現でき、GCプレッシャーを削減します。
問題: スライス操作がコピーを生成(アロケーション)
text = ;
sub = text.Substring();
ReadOnlySpan<> span = text.AsSpan();
Span<T>とMemory<T>は、連続メモリ(配列、文字列、バッファ)を効率的に操作するための最新の.NETの型です。アロケーションやコピーなしで既存メモリへのビューを提供することで、高パフォーマンスなコードを実現でき、GCプレッシャーを削減します。
text = ;
sub = text.Substring();
ReadOnlySpan<> span = text.AsSpan();
Substringや配列スライスなどの操作は新しいオブジェクトをアロケートしてデータをコピーします。Span<T>は代わりに既存メモリへのビュー(ポインタ+長さ)を提供します。スライス操作は何もコストがなく、アロケートもされません。
int[] numbers = { 1, 2, 3, 4, 5 };
Span<int> slice = numbers.AsSpan(1, 3); // {2, 3, 4} — a VIEW, no copy
slice[0] = 99; // modifies the ORIGINAL array (it's a view)
// parse without allocating substrings
ReadOnlySpan<char> input = "123,456".AsSpan();
int first = int.Parse(input.Slice(0, 3)); // parse a slice, no substring allocation
Span<T>では配列/文字列/バッファをアロケートなしでスライスして処理できます。これはホットパス(パース、シリアライゼーション、大規模データ処理)において重要です。
Span<T> is a ref struct — it can ONLY live on the stack (not on the heap, not in
async methods, not as a class field). This guarantees safety but limits where it's used.
// Memory<T> is like Span<T> but CAN be a field / used across await (heap-storable)
async Task ProcessAsync(Memory<byte> buffer) // works in async (Span<T> can't)
{
await stream.ReadAsync(buffer);
Span<byte> span = buffer.Span; // get a Span from it when you need to process
}
Memory<T>はSpan<T>を補完するもので、ビューを保存したり、非同期コードで使用したりする必要があるシナリオに対応します(Span<T>のスタックのみという性質では機能しない場面)。
Span<T>とMemory<T>は高パフォーマンス、アロケーションフリーなコードを実現するための重要な最新の.NET機能です。これらを理解することは、パフォーマンスクリティカルなアプリケーション向けの上級レベルの知識として価値があります。
これらの核となる価値は、連続メモリ(配列、文字列、バッファ)を既存メモリへのビューを提供することで効率的に操作し、新しいコピーをアロケートしないことです。これが重要なのは、アロケーションはGCプレッシャーを生成し、ホットパス(パース、シリアライゼーション、大規模データ処理、ネットワークバッファ)ではアロケーションを回避することで大幅にパフォーマンスが向上するためです。
通常はアロケートされる操作(Substring、配列スライス)をスパンでアロケーションフリーに実行でき、メモリ使用量とGCオーバーヘッドを削減します。
Span<T>(配列/文字列/バッファのゼロコピースライシング)、そのスタックのみという制約(ref structなので、クラスフィールドになったり非同期メソッドで使用されたりできない。重要な制限)、そして**Memory<T>**(保存でき非同期コードで使用できるその補完)を理解することは、高パフォーマンスなC#を書くために重要です。
これらの型は最新の.NET自体のパフォーマンスクリティカルなコードで広く使用されており、アロケーションフリーで効率的なメモリ処理が必要なライブラリやアプリケーションで次第に採用されています。
日々のビジネスロジックには必要ありませんが、Span<T>/Memory<T>を理解すること(それらが何をするか[アロケーションフリーなメモリビュー]、なぜ役立つか[アロケーション削減とGCプレッシャーの軽減]、その制約)は、パフォーマンスに敏感なC#開発(パース、シリアライゼーション、高スループットシステム)に価値があり、高度に効率的な.NETコードを書くことができる開発者を区別でき、パフォーマンス志向の上級職に関連するトピックです。