Насколько эффективно определение в PHP?
-
02-07-2019 - |
Вопрос
Препроцессор С++ #define
это совершенно другое.
PHP define()
что-то другое, чем просто создание var?
define("SETTING", 0);
$something = SETTING;
против
$setting = 0;
$something = $setting;
Решение
Сама операция «определить» выполняется довольно медленно, что подтверждено профилировщиком xdebug.
Вот тесты из http://t3.dotgnu.info/blog/php/my-first-php-extension.html:
чистое «определить»
380,785 выборок в секунду
14,2647 среднее мс/первый ответконстанты, определенные с расширением «hidef»
930,783 выборок в секунду
6,30279 среднее мс/первый ответ
обновление неработающей ссылки
Сообщение в блоге, упомянутое выше, покинуло Интернет.Это еще можно посмотреть здесь через Wayback Machine.Вот еще один похожая статья.
Библиотеки, на которые ссылается автор, можно найти. здесь (apc_define_constants) и здесь (скрыть расширение).
Другие советы
В общем, идея константы заключается в том, чтобы постоянный, (Звучит смешно, правда?;)) внутри твоего программа.Это означает, что компилятор (интерпретатор) заменит «FOOBAR» значением FOOBAR во всем вашем скрипте.
Вот вам и теория и плюсы - если скомпилировать.Теперь PHP довольно динамичен, и в большинстве случаев вы не заметите изменений, поскольку PHP-скрипт компилируется при каждом запуске.Могу сказать, что вы не должны видеть заметной разницы в скорости между константами и переменными, если вы не используете кеш байт-кода, такой как БТР, Дзен-оптимизатор или электронный акселератор.Тогда это может иметь смысл.
Все остальные преимущества/недостатки констант уже отмечены здесь и их можно найти в разделе Руководство по 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, я до сих пор сам не проводил тесты.)
вызов константы займет в 2 раза больше времени, чем вызов переменной.
проверка существования константы займет 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 раз, и, хотя накладные расходы на 1000 на 1000 вызовов не заставит конечных пользователей, вырывая свои волосы, это вызывает некоторые интересные результаты при сравнении с if (true):
1) Если ($ true) было практически идентичным 2) if (true_const) было почти вдвое медленнее - я думаю, что замена не выполнена во время компиляции (мне пришлось дважды проверить это!) 3) Defined () В 3 раза медленнее, если постоянная существует 4) определено () в 19 раз медленнее, если константа не существует!5) isset () удивительно эффективен независимо от того, что вы бросаете в него (отличная новость для всех, кто реализует системы событий, управляемых массивом - я!)
Возможно, следует избегать if(define('DEBUG'))...
от tris+php в tfconsulting dot com dot au 26 марта 2009 г. 06:40
Define — это простой статический смысл, то есть его значение не может быть изменено во время выполнения, тогда как переменная имеет динамический смысл, поскольку вы можете свободно манипулировать ее значением в процессе.
Основные отличия:
- определение является константой, переменная является переменной
- у них разный объем/видимость
Когда я запускаю тесты скорости, установка и выгрузка констант происходит намного быстрее, чем установка переменных и их выгрузка.
Не уверен насчет эффективности, но это больше, чем просто создание переменной:
- Это константа:вы не можете переопределить или переназначить эту НАСТРОЙКУ.
- Если определение не найдено, $something устанавливается в «SETTING», что полезно, например, в i18n:если перевод отсутствует (т.соответствующее определение — это файл локализации), мы видим большое слово в верхнем регистре, которое хорошо видно...