据我所知,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是否有效。是的,这是在代码中执行的,可能会执行上千次。
stdclass不是数组的替换。改为尝试ArrayObject。而且"更快"是相对的,在大多数情况下实际上不相关。
你理解错了。对象并不比数组"快得多"。事实上,相反的情况通常是正确的,因为数组不存在继承(和可见性查找)问题。当然,在某些特定的情况下,您可能会表现出明显的收益/损失,但在一般情况下,数组会更快…
使用语义正确的工具。不要因为认为对象更快而避免使用数组。有意义时使用结构。有时用对象替换数组是有意义的(例如,当您希望严格地强制数组中的类型时)。但这不是其中之一。即使这样,您也不会将array()替换为stdclass,而是将其替换为自定义类(可能扩展ArrayObject或至少实现Iterator和ArrayAccess接口)。存在不同的数据结构是有原因的。如果使用对象而不是数组更好,我们不是都在使用对象吗?
不要担心微观优化,比如"快速铸造"。几乎总是不会。编写可读、正确的代码。然后优化如果你有问题…
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将其转换为对象。我肯定不会花时间去担心它,除非您已经将有问题的代码确定为一个瓶颈(即使这样,如果可能的话,集中精力减少迭代次数)。
为正确的工作选择正确的数据结构更为重要。
当你想决定使用什么时,问问自己:你的数据代表什么?
你是代表一个集合还是一个序列?那么您可能应该使用一个数组。
你是用某些属性或行为来表示某种事物吗?那么您可能应该使用一个对象。