据我所知,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
的简写是否有效。是的,这可能会在代码中执行数千次。
答案 0 :(得分:8)
你理解错了。对象并不比数组“快得多”。事实上,相反的情况通常是正确的,因为数组没有继承问题(和可见性查找)。当然,可能会有特定情况下您可以显示明显的显着增益/损失,但在通用情况下,数组往往会更快......
使用语义正确的工具。不要因为您认为对象更快而避免使用数组。在有意义的时候使用构造。有时用对象替换数组是有意义的(例如,当你想严格强制执行数组中的类型时)。但这不是其中之一。即便如此,您也不会将array()替换为STDClass,而是将其替换为自定义类(可能扩展ArrayObject
或至少实现Iterator
和ArrayAccess
接口)。存在不同的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)
为正确的工作选择正确的数据结构更为重要。
如果您想决定使用什么,请问自己:您的数据代表什么?
您是代表一组还是序列?那么你应该使用数组。
您是否代表某些具有某些属性或行为的东西?那么你应该使用一个对象。