Насколько эффективно определяется PHP?

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

Является ли PHP define() чем-то другим, чем просто создание var?

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

против

 $setting = 0; $something = $setting; 

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

Ниже приведены эталоны из http://t3.dotgnu.info/blog/php/my-first-php-extension.html :

  • чисто "определить"
    380.785 выборки / сек
    14.2647 означает msecs / first-response

  • константы, определенные с расширением 'hidef'
    930.783 выборки / сек
    6.30279 среднее значение msecs / first-response


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

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

Библиотеки, на которые ссылаются автор, можно найти здесь (apc_define_constants) и здесь (hidef extension) .

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

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

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

 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

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

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

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

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

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

напомнив константу, потребуется 2x время вызова переменной.

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

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

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

 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) если ($ true) было практически идентично 2) если (TRUE_CONST) было почти в два раза медленнее – я предполагаю, что подстановка не выполняется во время компиляции (мне пришлось дважды проверить это!) 3) defined () is 3 раза медленнее, если константа существует 4) определяется () равно 19 TIMES SLOWER, если константа не существует! 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

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

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

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

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

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

  • Это константа: вы не можете переопределить или переназначить эту настройку.
  • Если определение не найдено, $ something устанавливается на «SETTING», что полезно, например, в i18n: если перевод отсутствует (т. Е. Соответствующий define является файлом локализации), мы видим большое слово в прописные, вполне видимые …