通过数字键或关联键更好地访问数组?

5

我遍历一个数组的数组,并通过关联键访问数组的值,这是一段代码片段。注意:我不会遍历整个数组,而只会遍历窗口大小为10的一部分。

//extract array from a db table (not real code)
$array = $query->executeAndFetchAssociative;

$window_start = 0;

for($i = $window_start; $i<count($array) && $i<$window_start+10; $i++)
  echo($entry["db_field"]);

这是一个适用于 Web 界面的分页器。我收到了 window_start 值并显示接下来的 10 个值。
一个大致的执行过程: 1. 接收 window_start 数字。 2. 开始循环并输入外部数组的 window_start-TH 数组。 3. 通过关联索引显示内部数组字段的值。 4. 移动到 window_start+1。
内部数组大约有40个字段。由于外部数组代表数据库表,因此它可能会变得非常大。现在我发现随着外部数组大小的增长,对10个窗口的执行需要越来越多的时间。
我需要有关代码性能的一些"性能理论":
如果我通过数字键输入内部数组的值,是否可以获得更好的性能?通常情况下,使用数字索引访问数组值比使用关联索引(字符串)访问更快吗?
输入长度为 N 的数组中的随机条目($array[random_num])的成本是多少?例如 O(N)、O(N/2)等。
最后,迭代数组的速度取决于数组的长度吗?我的固定长度迭代总是在10个元素的数组上进行,但是数组长度如何影响我的固定长度迭代?
谢谢 阿尔贝托

1
使用循环时的一般优化方法:将数学计算(count$window_start+10)移出循环;在循环之前只进行一次计算,而不是在每次迭代中都进行计算。如果您遵循下面的答案,这对您的情况不应该有任何影响,因为您将不再进行任何计算。 - jeroen
2个回答

8
如果我通过数字键输入内部数组的值,我能获得更好的性能吗?通常使用数字索引访问数组值比使用关联索引(字符串)访问更快吗?
理论上,基于整数的访问与基于字符串的访问可能会有速度差异(这取决于整数值的哈希函数和字符串值的哈希函数之间的差异,我没有阅读PHP源代码以获得明确的答案),但它肯定是可以忽略不计的。
在长度为N的数组中输入随机条目($array[random_num])的成本是多少?例如 O(N),O(N/2)。
PHP中的数组是通过哈希表实现的,这意味着插入的时间复杂度是摊还O(1)——几乎所有的插入操作都是O(1),但有些操作可能是O(n)。顺便提一下,O(n)和O(n/2)是一样的;你可能需要重新阅读一下关于算法复杂度的文本。
最后,迭代一个数组的速度是否取决于数组的长度?我的意思是,我总是在遍历10个元素的数组,但是数组长度如何影响我的固定长度迭代?
不,数组长度不是一个因素。
性能下降并不是因为您访问数组的方式,而是因为您似乎加载了所有的记录来处理其中的10个。
您应该将分页逻辑移动到数据库本身,通过在SQL查询中包含偏移量和限制。

谢谢您的回答,我明白了:分页应该移动到数据库中。除了分页任务外,我还在寻找一些“PHP数组性能理论”…… - ab_dev86

3

过早的优化是万恶之源。额外的数值和关联数组有非常不同的语义意义,因此通常不能互换使用。最后但并非最不重要的一点:PHP中的数组是作为哈希表实现的,并且通过键访问它们始终是O(1)

在您的情况下(分页),只获取要显示的项目比获取所有项目并稍后切片更有用。SQL具有LIMIT 10 OFFSET 20语法处理此问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接