Эффективность PHP массивов, приведенных как объекты? - PullRequest
1 голос
/ 07 января 2011

Насколько я понимаю, объекты PHP stdClass обычно работают быстрее, чем массивы, когда код достаточно глубоко вложен, чтобы он действительно имел значение.Как повлияет эта эффективность, если я приведу типирование для определения stdClass объектов «на лету»:

$var = (object)array('one' => 1, 'two' => 2);

Если код, выполняющий это, будет выполняться много-много раз, я лучше буду явно определять$var вместо этого как объекты:

$var = new stdClass();
$var->one = 1;
$var->two = 2;

Разница незначительна, так как тогда я получу доступ к $var как к объекту в любом случае?

Редактировать:

stdClass - это тип данных, который мне нужен здесь.Меня не интересует, использовать ли мне массивы или использовать объекты stdClass;Меня больше беспокоит вопрос о том, насколько эффективно использование (object)array(....) для создания stdClass.И да, это в коде, который будет выполняться потенциально тысячи раз.

Ответы [ 3 ]

8 голосов
/ 07 января 2011

Вы неправильно поняли.Объекты не "намного быстрее", чем массивы.Фактически, обычно верно обратное, поскольку у массивов нет проблемы наследования (и поиска видимости).Конечно, могут быть конкретные случаи, когда вы можете продемонстрировать явный значительный выигрыш / убыток, но в общем случае массивы будут иметь тенденцию работать быстрее ...

Используйте инструмент, который семантически корректен.Не избегайте использования массивов, потому что вы думаете, что объекты быстрее.Используйте конструкцию, когда это имеет смысл.Бывают случаи, когда имеет смысл заменить массив объектом (например, когда вы хотите строго принудительно применять типы в массиве).Но это не один из них.И даже при этом вы бы не заменили array () на STDClass, вы бы заменили его на собственный класс (который, вероятно, расширяет ArrayObject или, по крайней мере, реализует Iterator и ArrayAccess интерфейсы).Различные структуры данных существуют по определенной причине.Если бы было лучше использовать объекты вместо массивов, разве мы все не будем использовать объекты вместо этого?

Не беспокойтесь о микрооптимизациях, таких как «выполняется быстрее».Это почти всегда не .Напишите читаемый, правильный код.Затем оптимизируйте, если у вас возникли проблемы ...

4 голосов
/ 14 января 2011
function benchmark($func_name, $iterations) {
    $begin = microtime(true);
    for ($i = 0; $i < $iterations; $i++) {
        $func_name();
    }
    $end = microtime(true);

    $execution_time = $end - $begin;

    echo $func_name , ': ' , $execution_time;
}

function standClass() {
    $obj = new stdClass();
    $obj->param_one = 1;
    $obj->param_two = 2;
}

function castFromArray() {
    $obj = (object)array('param_one' => 1, 'param_two' => 2);
}


benchmark('standClass', 1000);
benchmark('castFromArray', 1000);

benchmark('standClass', 100000);
benchmark('castFromArray', 100000);

Выходы:

standClass: 0.0045979022979736
castFromArray: 0.0053138732910156

standClass: 0.27266097068787
castFromArray: 0.20209217071533

Преобразование из массива в stdClass на лету примерно на 30% эффективнее, но разница по-прежнему незначительна, пока вы не узнаете, что будете выполнять операцию 100 000 раз(и даже тогда, вы смотрите только одну десятую секунды, по крайней мере, на моей машине).

Итак, в общем, это не имеет значения в подавляющем большинстве случаев, но еслион определяет массив в одной команде, а затем приводит его к типу объекта.Я определенно не стал бы тратить время на беспокойство об этом, если вы не определили рассматриваемый код как узкое место (и даже тогда, если возможно, сосредоточитесь на сокращении количества итераций).

0 голосов
/ 07 января 2011

Более важно выбрать правильную структуру данных для правильной работы.

Когда вы хотите решить, что использовать, спросите себя: что представляют ваши данные?

Представляете ли вынабор или последовательность?Тогда вам, вероятно, следует использовать массив.

Представляете ли вы какую-то вещь с определенными свойствами или поведением?Тогда вам, вероятно, следует использовать объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...