Да, я использую профилировщик (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-loop занимает много времени. Я думал, что это связано с тем, что он постоянно должен называть Get get. Поэтому я создал локальный int height = Height;
перед циклами и сделал проверку внутреннего цикла для y < height
. Это действительно ухудшило производительность! ANTS теперь сказал мне, что проблема с x-loop-линией была проблемой. А? Это должно быть незначительным, это внешняя петля!
В конце концов у меня появилось откровение - возможно, с использованием свойства для привязки к внешнему циклу и локального для CLR-перехода, связанного с внутренним циклом, часто между кешем "locals" и кешем этого "указателя" (I 'm привык думать в терминах кэша CPU). Поэтому я создал локальную и для Width, и это исправило ее.
Оттуда было ясно, что я должен сделать локальный и для Data, даже несмотря на то, что Data не был даже свойством (это было поле). И действительно, это купило мне еще большую производительность.
Сбивчиво, однако, переупорядочение петель x и y (для улучшения использования кеша) сделало нулевую разницу, хотя массив огромен (3000x3000).
Теперь я хочу узнать, почему материал, который я сделал, улучшил производительность. Какую книгу вы предлагаете прочитать?