PHP数组作为对象的效率?

时间:2011-01-07 17:38:28

标签: php arrays object performance

据我所知,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 个答案:

答案 0 :(得分:8)

你理解错了。对象并不比数组“快得多”。事实上,相反的情况通常是正确的,因为数组没有继承问题(和可见性查找)。当然,可能会有特定情况下您可以显示明显的显着增益/损失,但在通用情况下,数组往往会更快......

使用语义正确的工具。不要因为您认为对象更快而避免使用数组。在有意义的时候使用构造。有时用对象替换数组是有意义的(例如,当你想严格强制执行数组中的类型时)。但这不是其中之一。即便如此,您也不会将array()替换为STDClass,而是将其替换为自定义类(可能扩展ArrayObject或至少实现IteratorArrayAccess接口)。存在不同的Data Structures是有原因的。如果最好使用对象而不是数组,那么我们不是都会使用对象吗?

不要担心像“投快”的微优化。这是almost always not。写可读,正确的代码。如果您遇到问题,请进行优化...

答案 1 :(得分:4)

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次操作之前,差异仍然可以忽略不计(即便如此,您只需看十分之一一秒钟,至少在我的机器上。)

因此,简而言之,绝大部分时间并不重要,但如果确实如此,则在单个命令中定义数组,然后将其类型转换为对象。我绝对不会花时间担心它,除非你已经将有问题的代码确定为瓶颈(即便如此,如果可能的话,专注于减少迭代次数。)

答案 2 :(得分:0)

为正确的工作选择正确的数据结构更为重要。

如果您想决定使用什么,请问自己:您的数据代表什么?

您是代表一组还是序列?那么你应该使用数组。

您是否代表某些具有某些属性或行为的东西?那么你应该使用一个对象。