Что быстрее?Константы, Переменные или Массивы Переменных - PullRequest
23 голосов
/ 14 октября 2011

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

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

Ответы [ 6 ]

23 голосов
/ 14 октября 2011

Константы, определенные с помощью define(), довольно медленно работают в PHP. Люди на самом деле написали расширения (например, hidef ) для улучшения производительности.

Но если у вас нет большого количества констант, это не должно иметь большого значения.

Начиная с PHP 5.3, вы также можете использовать константы времени компиляции, используя const NAME = VALUE;. Это намного быстрее.

11 голосов
/ 14 октября 2011

Разница будет очень мала (микро оптимизации).Вам лучше инкапсулировать некоторые из ваших констант в классы, чтобы вы могли получить к ним доступ через Classname::CONSTANT, чтобы не загрязнять глобальное пространство имен вашего приложения.

8 голосов
/ 24 января 2013

Быстрый тест показал, что определение констант (define('FOO', 'bar');) примерно в 16-18 раз медленнее, чем определение переменной ($foo = 'bar';), но использование определенного (постоянного) значения примерно в 4-6 раз быстрее.

0 голосов
/ 19 сентября 2018

Я тестировал constants против variables и заметил значительное улучшение производительности при использовании variables по сравнению с constants.Я знаю, что это довольно очевидно, но определенно стоит принять во внимание, что использование локальных переменных над константами всегда, когда это возможно.

Если constants используется внутри loops количество раз, это определенно стоитобъявив константу как переменную класса / local и использовать ее вместо этого.

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

TestConstants.php

class TestConstants 
{   
    const TEST_CONSTANT = 'This is a constant value';

}

Test.php

use TestConstants;

class Test {

    protected $TEST_CONSTANT;
    protected $limit = 10000000;
    function __construct() {
        $this->TEST_CONSTANT = 'This is a constant value';
    }

    function testA() {
        $limit = $this->limit;
        $time_start = microtime(true); 
        for ($i = 0; $i < $limit; ++$i) {
            TestConstants::TEST_CONSTANT;
        }
        $time_end = microtime(true);
        $execution_time = ($time_end - $time_start);
        echo ''. $execution_time .' seconds <br/>';
    }

    function testB() {
        $limit = $this->limit;
        $time_start = microtime(true); 
        for ($i = 0; $i < $limit; ++$i) {
            $this->TEST_CONSTANT;
        }
        $time_end = microtime(true);
        $execution_time = ($time_end - $time_start);
        echo ''. $execution_time .' seconds <br/>';
    }   
}

$test = new Test();
$test->testA();
$test->testB();

Результаты следующие:

testA () выполняется за 0,55921387672424 секунды

и

testB () выполняется за 0,33076691627502 секунд

Версия PHP

5.6.30

Я думалчтобы поделиться этим как с кем-то, можно было бы выиграть, избегая прямых вызовов на constants (особенно внутри циклов), объявив их как variables, где это применимо.

Спасибо.

0 голосов
/ 17 июля 2012

Результаты этих тестов по-прежнему сохраняются;переменные быстрее, чем define() и const: http://planetozh.com/blog/2006/06/php-variables-vs-constants

http://www.joomlaperformance.com/articles/performance/52_php_programming_tips_43_13_2.html

0 голосов
/ 14 октября 2011

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

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

Не существует единого ответа, который подходит всем, но популярным решением является либо использование класса реестра, либо создание его самостоятельно. Вы можете сделать это довольно легко, объявив массив php. Затем вы инициализируете объект реестра, и ваши функции и классы обращаются к нему через статический вызов метода. Вместо того, чтобы предоставлять вам фрагменты, я просто отсылаю вас к zend_config и zend_registry в качестве примеров. Хотя ZF предоставляет их, вы не должны бояться накатывать свои собственные версии, поскольку ни одну из них особенно сложно воссоздать в более простой форме, если вы хотите избежать использования ZF в своем проекте.

...