Насколько эффективно определить в PHP? - PullRequest
19 голосов
/ 29 сентября 2008

C ++ препроцессор #define совершенно другой.

Отличается ли PHP define() от простого создания переменной?

define("SETTING", 0);  
$something = SETTING;

против

$setting = 0;  
$something = $setting;

Ответы [ 9 ]

16 голосов
/ 17 марта 2010

Операция 'define' сама по себе довольно медленная - подтверждено профилировщиком xdebug.

Вот тесты от http://t3.dotgnu.info/blog/php/my-first-php-extension.html:

  • pure 'define'
    380,785 запросов в секунду
    14.2647 среднее значение мсек / первый ответ

  • константы, определенные с расширением 'hidef'
    930,783 выборок / сек
    6,30279 среднее значение мсек / первый ответ


обновление неработающей ссылки

Сообщение в блоге, указанное выше, покинуло Интернет. Это все еще может быть просмотрено здесь через Wayback Machine . Вот еще одна аналогичная статья .

Библиотеки, на которые ссылается автор, находятся здесь (apc_define_constants) и здесь (расширение hidef) .

5 голосов
/ 04 декабря 2009
php > $cat='';$f=microtime(1);$s='cowcow45';$i=9000;while ($i--){$cat.='plip'.$s.'cow';}echo microtime(1)-$f."\n";

+0,00689506530762

php > $cat='';$f=microtime(1);define('s','cowcow45');$i=9000;while ($i--){$cat.='plip'.s.'cow';}echo microtime(1)-$f."\n";

+0,00941896438599

Это повторяется с похожими результатами. Мне кажется, что константы немного медленнее определять и / или использовать, чем переменные.

5 голосов
/ 29 сентября 2008

В общем, идея константы в том, чтобы быть константой , (звучит смешно, правда?;)) Внутри вашей программы . Это означает, что компилятор (интерпретатор) заменит «FOOBAR» значением FOOBAR во всем сценарии.

Так много для теории и преимуществ - если вы компилируете. Теперь PHP довольно динамичен, и в большинстве случаев вы не заметите другого, потому что скрипт PHP компилируется при каждом запуске. Afai-can-сказать, вы не должны видеть заметную разницу в скорости между константами и переменными, если вы не используете кэш байт-кода, такой как APC , Zend Optimizer или eAccelerator . Тогда это может иметь смысл.

Все другие преимущества / недостатки констант уже были отмечены здесь и могут быть найдены в руководстве по PHP .

4 голосов
/ 29 сентября 2008

Вот отличия от руководства

  • Константы не имеют знака доллара ($) перед ними;
  • Константы могут быть определены только с помощью функции define (), а не с помощью простого присваивания;
  • Константы могут быть определены и доступны в любом месте без учета переменных правил области видимости;
  • Константы не могут быть переопределены или неопределены после их установки; и
  • Константы могут оцениваться только в скалярных значениях.

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

3 голосов
/ 11 апреля 2012

НЕ эффективно, кажется. (И я основываю все предположения здесь на одном комментарии от php.net, я все еще не делал тесты самостоятельно.)

вызов константы, в два раза больше времени вызова переменной.

проверка существования константы займет 2 мс и 12 мс для ложного срабатывания!

Вот пример из комментариев к странице определения в онлайн-документе php.

Перед использованием define () взгляните на следующие тесты:

true                                       0.65ms
$true                                      0.69ms (1)
$config['true']                            0.87ms
TRUE_CONST                                 1.28ms (2)
true                                       0.65ms
defined('TRUE_CONST')                      2.06ms (3)
defined('UNDEF_CONST')                    12.34ms (4)
isset($config['def_key'])                  0.91ms (5)
isset($config['undef_key'])                0.79ms
isset($empty_hash[$good_key])              0.78ms
isset($small_hash[$good_key])              0.86ms
isset($big_hash[$good_key])                0.89ms
isset($small_hash[$bad_key])               0.78ms
isset($big_hash[$bad_key])                 0.80ms

PHP версии 5.2.6, Apache 2.0, Windows XP

Каждый оператор выполнялся 1000 раз, а время включения 12 мс 1000 звонков не заставят конечных пользователей рвать на себе волосы, он действительно дает некоторые интересные результаты при сравнении с if (true):

1) if ($ true) был практически идентичен 2) if (TRUE_CONST) был почти в два раза медленнее - я думаю, что подстановка не выполняется при компиляции время (мне пришлось перепроверить это!) 3) определено () в 3 раза медленнее если константа существует, 4) определен () 19 раз, если константа не существует! 5) isset () замечательно эффективен независимо о том, что вы бросаете на это (отличная новость для тех, кто реализует массив управляемые системы событий - я!)

Может хотеть избежать, если (определено ('DEBUG')) ...

от tris + php в tfconsulting dot com dot au 26-Mar-2009 06: 40

http://us.php.net/manual/en/function.defined.php#89886

1 голос
/ 26 июля 2011

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

0 голосов
/ 01 декабря 2008

Когда я запускаю тесты скорости, устанавливаемые и выгружаемые константы работают намного быстрее, чем установка переменных и их выгрузка.

0 голосов
/ 29 сентября 2008

Не уверен насчет эффективности, но это больше, чем создание переменной:

  • Это константа: вы не можете переопределить или переназначить эту НАСТРОЙКУ.
  • Если определение не найдено, $ что-то устанавливается в «SETTING», что полезно, например, в i18n: если перевод отсутствует (т.е. соответствующее определение является файлом локализации), мы видим большое слово в верхнем регистре, довольно хорошо видно ...
0 голосов
/ 29 сентября 2008

Основные отличия:

  • определение является константой, переменная является переменной
  • они различаются размахом / видимостью
...