Каковы накладные расходы на вызов метода в цикле?C#

Место общения программистов C#
Ответить
Anonymous
 Каковы накладные расходы на вызов метода в цикле?

Сообщение Anonymous »

Некоторое время я работал над генератором лабиринтов на C#, который может генерировать лабиринты размером примерно 128000x128000 пикселей. Все использование памяти уже оптимизировано, поэтому в настоящее время я рассматриваю возможность ускорения генерации.

Проблема (скорее не интересная), которую я обнаружил, заключалась в следующем (просто пример кода, иллюстрирующего проблему):

Этот код выполняется на моем компьютере примерно за 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));
}
}
Где следующий код выполняется на 0,4 секунды быстрее

Код: Выделить всё

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));
}
}
}
}
Похоже, что простой вызов «пустого» метода занимает около 20% процессора, который использует этот алгоритм. Разве это не странно? Я пытался скомпилировать решение в режиме отладки и выпуска, но не обнаружил заметных различий.

Это означает, что каждый вызов метода в этом цикле замедлит мой код примерно на 0,4 секунды. Поскольку код генератора лабиринта в настоящее время состоит из множества отдельных вызовов методов, выполняющих различные действия, это начинает набирать значительную сумму.

Я также проверил Google и другие сообщения. о переполнении стека, но пока не нашел решения.

Можно ли автоматически оптимизировать такой код? (Может быть, с такими вещами, как проект Рослин???) или мне следует объединить все в один большой метод?

Редактировать:
Мне тоже интересно, может быть, некоторый анализ различий кода JIT/CLR в этих двух случаях. (Итак, откуда на самом деле возникла эта проблема)

Edit2:
Весь код был скомпилирован в режиме выпуска

Подробнее здесь: https://stackoverflow.com/questions/131 ... -in-a-loop
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»