Проблема (скорее не интересная), которую я обнаружил, заключалась в следующем (просто пример кода, иллюстрирующего проблему):
Этот код выполняется на моем компьютере примерно за 1,4 секунды, когда значение PixelChanged равно нулю:
Код: Выделить всё
public void Go()
{
for (int i = 0; i < bitjes.Length; i++)
{
BitArray curArray = bitjes[i];
for (int y = 0; y < curArray.Length; y++)
{
curArray[y] = !curArray[y];
GoDrawPixel(i, y, false);
}
}
}
public void GoDrawPixel(int i, int y, Boolean enabled)
{
if (pixelChanged != null)
{
pixelChanged.Invoke(new PixelChangedEventArgs(i, y, enabled));
}
}
Код: Выделить всё
public void Go()
{
for (int i = 0; i < bitjes.Length; i++)
{
BitArray curArray = bitjes[i];
for (int y = 0; y < curArray.Length; y++)
{
curArray[y] = !curArray[y];
if (pixelChanged != null)
{
pixelChanged.Invoke(new PixelChangedEventArgs(i, y, false));
}
}
}
}
Это означает, что каждый вызов метода в этом цикле замедлит мой код примерно на 0,4 секунды. Поскольку код генератора лабиринта в настоящее время состоит из множества отдельных вызовов методов, выполняющих различные действия, это начинает набирать значительную сумму.
Я также проверил Google и другие сообщения. о переполнении стека, но пока не нашел решения.
Можно ли автоматически оптимизировать такой код? (Может быть, с такими вещами, как проект Рослин???) или мне следует объединить все в один большой метод?
Редактировать:
Мне тоже интересно, может быть, некоторый анализ различий кода JIT/CLR в этих двух случаях. (Итак, откуда на самом деле возникла эта проблема)
Edit2:
Весь код был скомпилирован в режиме выпуска
Подробнее здесь: https://stackoverflow.com/questions/131 ... -in-a-loop
Мобильная версия