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


PHP Is a 36 row by 56 column faster/lighter than a 56 row 36 column 2Dimensional Array?

我目前有一个二维数组,填充如下:

$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 行至少会稍微快一点,但快多少??为什么呢?

也更轻,还是不??

好吧,我很欣赏这些数字很小,如果我们处理的情况要大得多怎么办,我对引擎盖下的工作感兴趣!

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(。

这个答案也可能对你有用。

更新

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

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

差异要大得多,为2.14%。我无法获得有关内存占用的结论性数据;在这一点上,我确信没有值得一提的区别。

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