Итерация/индексатор `Span` МЕДЛЕННЕЕ, чем Array, почему?C#

Место общения программистов C#
Anonymous
Итерация/индексатор `Span` МЕДЛЕННЕЕ, чем Array, почему?

Сообщение Anonymous »

Итак, у меня есть метод, который создает массив и вычисляет каждый элемент;

Код: Выделить всё

//pseudo code
public static void MyMethod(int length)
{
char[] output = new char[length];
for (int i = 0; i < length; i++)
{
output[i] = DoStuff(i);
}
}
Интересно, что если я использую Span - код (ожидается) использует в 5 раз меньше памяти, но становится на 20 % медленнее (сделал Тест BDN на .NET 8)

Код: Выделить всё

public static void MyMethod(int length)
{
Span output = stackalloc char[length]; //this line is the only change
for (int i = 0; i < length; i++)
{
output[i] = DoStuff(i);
}
}
Почему? Я думал, что Span должен быть быстрее?
Мое предположение: возможно, поскольку массивы имеют фиксированную длину, компилятор умен и удаляет связанные проверки внутри цикла, потому что он «знает», что цикл находится только в пределах границ массива.
Однако длина Span может меняться, поэтому проверка границ выполняется ВСЕГДА.
Есть какое-нибудь другое объяснение? И как мне избавиться от этих связанных чеков? Пробовал использовать unsafe и фиксированный символ*, но результаты те же.
ОБНОВЛЕНИЕ: нашел похожую ветку на Reddit, которая также предлагает связанные проверки, и что local массивы действительно могут быть быстрее, чем Span https://www.reddit.com/r/csharp/comment ... _vs_array_ Performance/ (проверьте второй комментарий)

Подробнее здесь: https://stackoverflow.com/questions/783 ... -array-why

Вернуться в «C#»