【问题标题】:Efficiency of PHP arrays cast as objects?PHP数组转换为对象的效率?
【发布时间】:2011-06-05 10:26:24
【问题描述】:

据我了解,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。此外,“更快”是相对的,在大多数情况下实际上是无关紧要的。

标签: php arrays object performance


【解决方案1】:

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

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

不必担心诸如“施法速度更快”之类的微优化。这是almost always not。编写可读、正确的代码。如果遇到问题,请优化...

【讨论】:

    【解决方案2】:
    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 次(即便如此,您也只看到了十分之一一秒钟,至少在我的机器上)。

    因此,简而言之,绝大多数情况下它并不重要,但如果确实如此,请在单个命令中定义数组,然后将其类型转换为对象。我绝对不会花时间担心它,除非您已将相关代码确定为瓶颈(即便如此,如果可能,请专注于减少迭代次数)。

    【讨论】:

      【解决方案3】:

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

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

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

      您是否代表具有某些属性或行为的事物?那么你可能应该使用一个对象。

      【讨论】:

        猜你喜欢
        • 2022-01-14
        • 2022-01-20
        • 1970-01-01
        • 2019-09-18
        • 2017-09-13
        • 2023-03-25
        • 1970-01-01
        • 2011-11-08
        • 2014-11-09
        相关资源
        最近更新 更多