Почему разработчики .NET Framework выбрали 10 (на x64 12) в качестве фактора при развертывании цикла? - PullRequest
0 голосов
/ 28 ноября 2018

Посмотрите в исходном коде C #, я вижу метод строки EqualsHelper :

    // unroll the loop 
#if AMD64 
    // for AMD64 bit platform we unroll by 12 and
    // check 3 qword at a time. This is less code 
    // than the 32 bit case and is shorter pathlength

    while (length >= 12) 
    {
        if (*(long*)a     != *(long*)b) break; 
        if (*(long*)(a+4) != *(long*)(b+4)) break; 
        if (*(long*)(a+8) != *(long*)(b+8)) break;
        a += 12; b += 12; length -= 12; 
    }
#else
    while (length >= 10)
    { 
        if (*(int*)a != *(int*)b) break;
        if (*(int*)(a+2) != *(int*)(b+2)) break; 
        if (*(int*)(a+4) != *(int*)(b+4)) break; 
        if (*(int*)(a+6) != *(int*)(b+6)) break;
        if (*(int*)(a+8) != *(int*)(b+8)) break; 
        a += 10; b += 10; length -= 10;
    }
#endif

Я хочу знать, почему цикл разворачивается на 10 или 12, если это из-заоптимизация ЦП: SIMD (несколько данных одной инструкции)?

Почему бы мне не написать напрямую:

while (length > 0) 
{
    if (*(int*)a != *(int*)b) break;
    a += 2; b += 2; length -= 2;
}
...