2011-01-07 3 views
1

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

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

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

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

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

Edit:

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

+1

stdClass не является заменой массиву. Вместо этого попробуйте ArrayObject. Кроме того, «намного быстрее» является относительным и в большинстве случаев фактически не имеет значения. – Mchl

ответ

3
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% более эффективным, но разница все еще незначительна, пока вы не знаете, что вы будете выполнять эту операцию 100000 раз (и даже тогда вы смотрите только на десятую часть секунды, по крайней мере на моей машине).

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

7

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

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

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

0

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

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

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

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

Смежные вопросы