C: что быстрее, доступ к глобальной переменной или передача указателя на функцию - PullRequest
5 голосов
/ 16 октября 2010

Я сейчас переписываю одну из своих программ. Имеет сильно рекурсивную функцию, которая решает пасьянс:

int solve(int draw) {
  if (finished())
    return true;

  //loop over every possible move (about 76 long values)
  //do a move (access the board, which is a long value)
  if (solve(draw + 1))
    return true;

  return false;
}

Так что мне было интересно, если это быстрее использовать решить так:

solve(int draw, long **moves, long *board) {}

На данный момент ходы и доска являются глобальными переменными.

Конечно, я собираюсь проверить это, но если кто-то скажет мне, что эта попытка не будет эффективной, я сэкономлю немного времени:).

С наилучшими пожеланиями

Ответы [ 4 ]

9 голосов
/ 16 октября 2010

Возможно, это будет не так эффективно, но единственный способ узнать наверняка - профилировать ваш код.Если большая часть вашего времени исполнения тратится на выполнение вашей реальной игровой логики, то крошечные затраты на размещение нескольких аргументов в стеке должны быть пренебрежимо малы.

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

3 голосов
/ 16 октября 2010

Я не думаю, что это узкое место в производительности.

Единственное, что приходит мне в голову после показанного вами кода, это:

Вам нужны длинные длинные переменные?Им обычно нужно больше места, что означает больше времени для их использования.Я помню, как однажды я заменил двойные переменные переменными с плавающей запятой, и я получил БОЛЬШОЙ прирост (на 50% меньше время выполнения).Это может немного помочь:)

2 голосов
/ 16 октября 2010

Это похоже на оптимизацию слишком рано!

Каждый раз, когда вы звоните решить (), вы должны проверить, если вы закончили ().Стоимость проверки выполненного () уничтожит любую разницу во времени доступа к переменной.

Сначала исправьте ее, затем профилируйте, если она слишком медленная, а затем оптимизируйте!

1 голос
/ 16 октября 2010

Существуют определенные издержки при передаче параметров в функцию - запись параметров в стек. В большинстве (вероятно, во всех) современных архитектурах доступ к стеку и глобальный доступ к данным имеют одинаковую скорость, поэтому, скорее всего, передаваемые параметры будут немного медленнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...