Preciso de uma maneira simples de converter Memory2D
do pacote CommunityToolkit.HighPerformance para um formato simples de coleção 1D. Lista / Matriz / Qualquer coisa assim 1D.
A melhor maneira que vejo por mim mesmo éMyMemory2D.ToArray().AsSpan().ToArray()
É uma boa abordagem? Alguma maneira mais rápida/ótima?
Alguma maneira mais rápida/ótima? [1] - Sua abordagem cria uma matriz 2D temporária (por meio da primeira chamada para
[1] Se esta é a maneira mais simples ou melhor, isso é uma questão de opinião.ToArray()
) e imediatamente cria a matriz 1D final a partir dela por meio da segunda.ToArray()
Seria mais rápido e eficiente pular a construção da matriz 2D intermediária alocando uma matriz 1D do tamanho correto e, em seguida, copiando diretamente para ela:Como corretamente apontado por dbc
ToArray
alocará um array extra que prejudicará a performance. Além da abordagem sugerida, você também pode alavancar oMemory2D<T>.CopyTo
método :Que parece ter o mesmo desempenho aproximado na minha máquina (via BenchmarkDotNet ):
Observe que existem métodos como
Memory2D<T>.TryGetMemory
eSpan2D<T>.TryGetSpan
which:E pode ser usado em alguns casos.
A melhor coisa a fazer seria não fazer nenhuma cópia. Apenas tirar isso
Span2D<T>
dali e então criar um normalSpan<T>
a partir disso.Você também pode usar um enumerador e
foreach
.