Span<T> — это структура данных, которая предоставляет доступ к диапазону элементов в памяти. Это меньше чем массив, потому что Span<T> является сегментом памяти, а не целым массивом. Memory<T> — очень похож на Span, но с возможностью работать с данными в куче. Он может быть использован в асинхронных операциях и может сохраняться как переменная.Работа с памятью без копий данных
Span и Memory позволяют работать с данными, не создавая новых копий.
public static void ProcessData()
{
// Создаем массив данных
int[] data = new int[100];
// Создаем Span, который ссылается на часть массива
Span<int> span = new Span<int>(data);
// Модифицируем данные через Span
span[0] = 42;
span[1] = 84;
// Выводим измененные данные
Console.WriteLine(data[0]); // 42
Console.WriteLine(data[1]); // 84
}
Использование Memory в асинхронных операциях
Если вам нужно передать данные в асинхронную задачу, используйте Memory, так как Span не может быть использован вне методов.
public async Task ProcessMemoryAsync()
{
byte[] data = new byte[100];
Memory<byte> memory = new Memory<byte>(data);
// Передаем данные в асинхронный метод
await SomeAsyncOperation(memory);
}
public async Task SomeAsyncOperation(Memory<byte> memory)
{
// Работа с Memory
memory.Span[0] = 1;
await Task.Delay(100); // асинхронная операция
}
Использование Memory с большими объемами данных
Если у вас есть большие данные, которые не помещаются в стек, используйте Memorу. Это позволит эффективно работать с кучей, сохраняя данные в памяти и передавая их по мере необходимости.
Span и Memory — это настоящие маги производительности в C#. Они позволяют работать с памятью быстро, избавляя от необходимости копировать данные и снижая нагрузку на сборщик мусора
🐸Библиотека шарписта #буст
