访问关联PHP数组中的对象时性能下降

Pas*_*cal 6 php oop command-line

我发现(命令行)PHP脚本的性能下降很大,这是由简单的赋值(运行时间从0.8~0.9秒增加到29.x秒)引起的.

该脚本首先从MySQL数据库中获取大量数据,并创建不同自定义类的对象.在获取之后(php现在使用大约500 MB的RAM)我循环一个大约3'500个Sample对象的数组,每个对象都有一个关联数组(大小约100个条目)作为其属性之一.该数组包含Value对象,这些对象是具有两个属性的小对象,键是小于6'000的整数.这是我偶然发现问题的地方,请看这段代码:

foreach ($samples as $id => $s) {    # $s is now a 'Sample' object
    $values = $s->values();          # $values is an array of 'Value' objects

    if (isset($values[$match_id])) {
        $num_tested++;
        # $val = $values[$match_id];     # contains a 'Value' object
        # $val = &$values[...]; -> the loop never ends (!)
    }
}
Run Code Online (Sandbox Code Playgroud)

注意注释行.如果我运行此处显示的代码,此块将运行大约0.8到0.9秒.如果我取消注释该单行,则该块运行将近30秒.我发现如果数组是非关联的(它只包含从0到大约100的连续键),运行时只会增加到1.8~1.9秒.
似乎这是因为我使用的非连续数组键,但是为什么性能还没有通过调用而下降isset($values[$match_id])呢?是否有针对此的解决方法或我必须忍受它?

运行PHP 5.3.0,Zend Engine v2.3.0,Mac OS X Server 10.6.2

Gor*_*don 3

如果您运行的是 5.3,请研究新的 Spl 数据结构。它们可以为较大的集合带来显着的性能提升,如此此处所示。除此之外,很难判断是什么原因导致了这个问题。您是否尝试过使用xdebugZend_Debugger获取更多详细信息?