Создает ли использование global какие-либо издержки? - PullRequest
2 голосов
/ 08 октября 2008

Проблема в том, что вы используете ключевое слово global для переменных, которые вы не используете? Для сравнения:

function foo() {
    global $fu;
    global $bah;
    if (something()) {
        $fu->doSomething();
    } else {
        $bah->doSomething();
    }
}

function bar() {
    if (something()) {
        global $fu;
        $fu->doSomething();
    } else {
        global $bah;
        $bah->doSomething();
    }
}

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

Ответы [ 4 ]

8 голосов
/ 08 октября 2008

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

Редактировать: Ради аргументов, я на самом деле пошел и проверил это, и bar() оказался медленнее на 0,1 с за миллион вызовов. Это означает, что с точки зрения производительности у вас все еще есть причина использовать более чистую версию.

1 голос
/ 08 октября 2008

Как сказал моноксид, существенной разницы в производительности нет.

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

0 голосов
/ 08 октября 2008

Глобальные переменные обычно считаются очень плохим стилем. Я бы сказал, что всякий раз, когда вам нужно использовать ключевое слово global или статическое свойство класса (и, таким образом, включая печально известный Singleton), вы должны серьезно пересмотреть то, что вы делаете. Может быть немного больше работы, чтобы избежать глобальных переменных, но это огромный бонус к поддержке кода. Этот конкретный пример может быть лучше выражен с помощью:

function foo($fu, $bah) {
  if (something()) {
    $fu->doSomething();
  } else {
    $bah->doSomething();
  }
}

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

0 голосов
/ 08 октября 2008

Если вы не знаете, вы можете сделать следующее:

function foo() {
    global $fu, $bah;
    if (something()) {
        $fu->doSomething();
    } else {
        $bah->doSomething();
    }
}

Вы можете поместить оба глобала в одну строку. Может даже сделать это быстрее:)

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