Efficiency of PHP arrays cast as objects?

前端 未结 3 1918
花落未央
花落未央 2021-01-15 20:00

From what I understand, PHP stdClass objects are generally faster than arrays, when the code is deeply-nested enough for it to actually matter. How is that eff

相关标签:
3条回答
  • 2021-01-15 20:26

    It's more important to chose the right data structure for the right job.

    When you want to decide what to use, ask yourself: What does your data represent?

    Are you representing a set, or a sequence? Then you should probably use an array.

    Are you representing some thing with certain properties or behaviors? Then you should probably use an object.

    0 讨论(0)
  • 2021-01-15 20:30

    You understand wrong. Objects are not "much faster" than arrays. In fact, the opposite is usually true, since arrays don't have the problem of inheritance (and visibility lookups). Sure, there may be specific cases where you can show a clear significant gain/loss, but in the generic case arrays will tend to be faster...

    Use the tool that's semantically correct. Don't avoid using arrays because you think objects are faster. Use a construct when it makes sense. There are times when it makes sense to replace an array with an object (For example, when you want to enforce the types in the array strictly). But this is not one of them. And even at that, you wouldn't replace array() with STDClass, you'd replace it with a custom class (one that likely extends ArrayObject or at least implements Iterator and ArrayAccess interfaces). Different Data Structures exist for a reason. If it was better to use objects instead of arrays, wouldn't we all be using objects instead?

    Don't worry about micro-optimizations like "is cast faster". It's almost always not. Write readable, correct code. Then optimize if you're having a problem...

    0 讨论(0)
  • 2021-01-15 20:31
    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);
    

    Outputs:

    standClass: 0.0045979022979736
    castFromArray: 0.0053138732910156
    
    standClass: 0.27266097068787
    castFromArray: 0.20209217071533
    

    Casting from an array to stdClass on the fly is around 30% more efficient, but the difference is still negligible until you know you will be performing the operation 100,000 times (and even then, you're only looking at a tenth of a second, at least on my machine).

    So, in short, it doesn't really matter the vast majority of the time, but if it does, define the array in a single command and then type-cast it to an object. I definitely wouldn't spend time worrying about it unless you've identified the code in question as a bottleneck (and even then, focus on reducing your number of iterations if possible).

    0 讨论(0)
提交回复
热议问题