Efficiency of PHP arrays cast as objects?
据我所知,php
1 |
如果执行此操作的代码要多次执行,我最好将
1 2 3 | $var = new stdClass(); $var->one = 1; $var->two = 2; |
区别是否可以忽略不计,因为我将从那里访问
编辑:
stdclass是我需要的数据类型。我不关心是应该使用数组还是应该使用stdclass对象;我更关心的是使用
你理解错了。对象并不比数组"快得多"。事实上,相反的情况通常是正确的,因为数组不存在继承(和可见性查找)问题。当然,在某些特定的情况下,您可能会表现出明显的收益/损失,但在一般情况下,数组会更快…
使用语义正确的工具。不要因为认为对象更快而避免使用数组。有意义时使用结构。有时用对象替换数组是有意义的(例如,当您希望严格地强制数组中的类型时)。但这不是其中之一。即使这样,您也不会将array()替换为stdclass,而是将其替换为自定义类(可能扩展
不要担心微观优化,比如"快速铸造"。几乎总是不会。编写可读、正确的代码。然后优化如果你有问题…
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将其转换为对象。我肯定不会花时间去担心它,除非您已经将有问题的代码确定为一个瓶颈(即使这样,如果可能的话,集中精力减少迭代次数)。
为正确的工作选择正确的数据结构更为重要。
当你想决定使用什么时,问问自己:你的数据代表什么?
你是代表一个集合还是一个序列?那么您可能应该使用一个数组。
你是用某些属性或行为来表示某种事物吗?那么您可能应该使用一个对象。