Код: Выделить всё
//pseudo code
public static void MyMethod(int length)
{
char[] output = new char[length];
for (int i = 0; i < length; i++)
{
output[i] = DoStuff(i);
}
}
Код: Выделить всё
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 может меняться, поэтому проверка границ выполняется ВСЕГДА.
Есть какое-нибудь другое объяснение? И как мне избавиться от этих связанных чеков? Пробовал использовать unsafe и фиксированный символ*, но результаты те же.
ОБНОВЛЕНИЕ: нашел похожую ветку на Reddit, которая также предлагает связанные проверки, и что local массивы действительно могут быть быстрее, чем Span https://www.reddit.com/r/csharp/comment ... _vs_array_ Performance/ (проверьте второй комментарий)
Подробнее здесь: https://stackoverflow.com/questions/783 ... -array-why