php对象和数组的效率,PHP数组作为对象的效率?

据我所知,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将其转换为对象。我肯定不会花时间去担心它,除非您已经将有问题的代码确定为一个瓶颈(即使这样,如果可能的话,集中精力减少迭代次数)。

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值