PHP数组作为对象的效率?

Efficiency of PHP arrays cast as objects?

据我所知,php stdClass对象通常比数组更快,因为代码的嵌套深度足以让它真正重要。如果我正在排版以定义动态的stdClass对象,这种效率会受到什么影响?

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

如果执行此操作的代码要多次执行,我最好将$var明确定义为对象,而不是:

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

区别是否可以忽略不计,因为我将从那里访问$var作为对象,无论哪种方式?

编辑:

stdclass是我需要的数据类型。我不关心是应该使用数组还是应该使用stdclass对象;我更关心的是使用(object)array(....)的缩写来实例化stdClass是否有效。是的,这是在代码中执行的,可能会执行上千次。


你理解错了。对象并不比数组"快得多"。事实上,相反的情况通常是正确的,因为数组不存在继承(和可见性查找)问题。当然,在某些特定的情况下,您可能会表现出明显的收益/损失,但在一般情况下,数组会更快…

使用语义正确的工具。不要因为认为对象更快而避免使用数组。有意义时使用结构。有时用对象替换数组是有意义的(例如,当您希望严格地强制数组中的类型时)。但这不是其中之一。即使这样,您也不会将array()替换为stdclass,而是将其替换为自定义类(可能扩展ArrayObject或至少实现IteratorArrayAccess接口)。存在不同的数据结构是有原因的。如果使用对象而不是数组更好,我们不是都在使用对象吗?

不要担心微观优化,比如"快速铸造"。几乎总是不会。编写可读、正确的代码。然后优化如果你有问题…


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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);

输出:

1
2
3
4
5
standClass: 0.0045979022979736
castFromArray: 0.0053138732910156

standClass: 0.27266097068787
castFromArray: 0.20209217071533

从一个数组到stdclass的转换效率提高了30%左右,但在您知道将执行100000次操作之前,差异仍然可以忽略不计(即使这样,您也只能看到十分之一秒,至少在我的机器上)。

因此,简而言之,它在大多数情况下并不真正重要,但是如果确实如此,可以在一个命令中定义数组,然后键入cast将其转换为对象。我肯定不会花时间去担心它,除非您已经将有问题的代码确定为一个瓶颈(即使这样,如果可能的话,集中精力减少迭代次数)。


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

当你想决定使用什么时,问问自己:你的数据代表什么?

你是代表一个集合还是一个序列?那么您可能应该使用一个数组。

你是用某些属性或行为来表示某种事物吗?那么您可能应该使用一个对象。