0

我目前有一个这样填充的二维数组:

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

还有更轻的,或者没有?

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

4

1 回答 1

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";
?>

相差约 0.178%。或者每月大约一小时的连续运行。

内存占用量有点难以测量,但即使每行的开销都在千字节的数量级(当然不是),我们最多也只能谈论大约 20 千字节。

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

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

更新

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

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

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

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

于 2013-10-12T10:26:23.787 回答