Что быстрее? Константы, переменные или массивы переменных

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

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

7 ответов

Решение

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

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

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

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

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

Я бенчмаркинг 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 где применимо.

Спасибо.

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

Результаты этих тестов по-прежнему сохраняются; переменные быстрее, чем оба 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

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

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

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

Другие вопросы по тегам