Да, я использую профилировщик (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
В конце концов у меня появилось откровение - возможно, использование свойства для привязки к внешнему циклу и локального для привязки к внутреннему циклу заставило CLR часто переходить между кешем "localals" и "this- указатель "кеша (я привык думать в терминах кеша процессора). Поэтому я также сделал локальный для Width, и это исправило его.
Оттуда было ясно, что я должен сделать локальный и для Data - даже если Data даже не был свойством ( это было поле). И действительно, это принесло мне еще большую производительность.
Однако, с удивлением, переупорядочение циклов x и y (для улучшения использования кэша) не дало никакой разницы, даже если массив огромен (3000x3000).
Теперь я хочу узнайте , почему то, что я сделал, улучшило производительность. Какую книгу вы предлагаете мне прочитать?