Как я могу достаточно узнать о CLR, чтобы составить обоснованное предположение о проблемах производительности?

Да, я использую профилировщик (ANTS) . Но на микроуровне он не может сказать вам, как исправить вашу проблему. И я сейчас на стадии микрооптимизации. Например, я профилировал это:

for (int x = 0; x < Width; x++)
{
    for (int y = 0; y < Height; y++)
    {
        packedCells.Add(Data[x, y].HasCar);
        packedCells.Add(Data[x, y].RoadState);
        packedCells.Add(Data[x, y].Population);
    }
}

ANTS показал, что линия Y-петли отнимает много времени. Я думал, что это потому, что это должно постоянно вызывайте получатель высоты. Поэтому я создал локальный int height = Height; перед циклами и сделал проверку внутреннего цикла для y . Это на самом деле ухудшило производительность! Теперь ANTS сказал мне, что проблема с x-loop - это проблема. Это должно быть незначительным, s внешний цикл!

В конце концов у меня появилось откровение - возможно, использование свойства для привязки к внешнему циклу и локального для привязки к внутреннему циклу заставило CLR часто переходить между кешем "localals" и "this- указатель "кеша (я привык думать в терминах кеша процессора). Поэтому я также сделал локальный для Width, и это исправило его.

Оттуда было ясно, что я должен сделать локальный и для Data - даже если Data даже не был свойством ( это было поле). И действительно, это принесло мне еще большую производительность.

Однако, с удивлением, переупорядочение циклов x и y (для улучшения использования кэша) не дало никакой разницы, даже если массив огромен (3000x3000).

Теперь я хочу узнайте , почему то, что я сделал, улучшило производительность. Какую книгу вы предлагаете мне прочитать?

10
задан Stefan Monov 6 September 2010 в 09:55
поделиться