我目前有一个二维数组,填充如下:
$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%。我无法获得有关内存占用的结论性数据;在这一点上,我确信没有值得一提的区别。
这只是创建时间:最重要的是在操作期间测量访问时间,这取决于算法。例如,如果按行进行访问,则在行中分配值肯定会更有效;如果按列,则相反。毕竟,可以预期访问操作的数量将超过创建数个数量级。