Загляните внутрь метода EqualsHelper в .NET Framework - PullRequest
7 голосов
/ 08 мая 2011

Я посмотрел на реализацию метода Equals класса String платформы .NET и обнаружил, что он использует метод EqualsHelper. Я обнаружил, что это действительно очень крутой и эффективный метод, но я нашел кое-что очень утомительное, почему они увеличивают указатели (или делают смещения) с помощью операции деления, например:

*(long*)(ptr + (IntPtr)8 / 2), ptr += (IntPtr)4 / 2; и т. д.

Спасибо!

1 Ответ

11 голосов
/ 08 мая 2011

Ах, причина, по которой я не понял, о чем вы говорите, в том, что вы смотрите на 64-битные источники, а не на 32-битные источники, как я изначально.

ЭтоОказывается, исходный файл исходного кода содержит директиву #if.Он делает разные вещи в зависимости от того, определен ли символ AMD64 во время компиляции.

Комментарии в исходном коде весьма поучительны.По сути, при компиляции инфраструктуры для 64-битных платформ они решили развернуть цикл на 12 и проверить 3 четырех слов за раз.Это оптимизация производительности, которая стала возможной благодаря другой системной архитектуре.

    // 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

Если вас интересуют внутренние компоненты .NET Framework, обязательно загрузите полную версию общего источника из этот сайт .Вы пропускаете много интересных вещей, когда пытаетесь сделать это, используя только .NET Reflector.Не последним из них являются комментарии.И, думаю, я видел, как люди спорят здесь, что комментарии не нужны в хорошо написанном коде!

...