PHP是一个36行乘56列比56行36列二维数组更快/更轻?

时间:2013-10-12 10:07:02

标签: php arrays multidimensional-array

我目前有一个2维数组,如下所示:

$spreadRaw = array_fill(1, 56, array_fill(1, 36, 99));

所以这是56行,36'列'

但是代码可以改写为:

$spreadRaw = array_fill(1, 36, array_fill(1, 56, 99));

所以36排56列。

我想36行至少会稍微快一些,但速度有多快?为什么?

也更轻,或不?

好的,我很欣赏这些数字很小,如果我们处理的是更大的情况,我对引擎盖下的工作感兴趣!

1 个答案:

答案 0 :(得分:1)

array_fill(1, 56, array_fill(1, 36, 99));

将导致57个呼叫,而反过来将导致37个呼叫。在后一种情况下,这些调用的论点有点大,所以事情往往会出错:

56 x 36:   1350,6 Kcalls/s

36 x 56:   1353,0 Kcalls/s

<?php
        $a = microtime(true);
        $k = 0;
        for(;;) {
                for ($i = 0; $i < 1000; $i++) {
                        $spreadRaw = array_fill(1, 56, array_fill(1, 36, 99));
                }
                $k++;
                if ((($b = microtime(true)) - $a) > 10) {
                        break;
                }
        }
        $t = $b-$a;
        print "$k Kcalls in $t seconds";
?>

差异为〜.178%。或者每月约一小时的连续运作。

内存占用有点难以衡量,但即使每行的开销大约为千字节(当然不是),我们也会在最外面谈论大约二十千字节。

您可能希望尝试使用一些代码覆盖率或分析工具来发现瓶颈所在的位置(例如http://www.xdebug.org/docs/profiler)。

This answer也可能对您有用。

更新

更大的测试用例,在1000到10000行或列之间切换,产生

1000 rows, 10000 columns = 5773 calls/s
10000 columns, 1000 rows = 5652 calls/s

差异大得多,为2.14%。我无法获得有关内存占用的确凿数据;在这一点上,我确信没有值得说的差异。

这只是创建时间:最重要的是测量操作期间的访问时间,这取决于算法。例如,如果要按行进行访问,那么确定在行中分配值会更有效;如果按列,反之。毕竟,预计访问操作的数量将超过创作几个数量级。