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

时间:2012-03-22 13:45:58

标签: php arrays performance associative-array

我迭代一个数组数组并通过关联键访问数组的值,这是一个代码片段。注意:我从不迭代整个数组,只能使用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界面的分页器。我收到了windows_start值并显示了接下来的10个值。

概念执行:

  1. 接收windows_start号码
  2. 开始循环进入外部数组的window_start-TH数组
  3. 通过关联索引
  4. 显示内部数组的字段值
  5. 移至window_start + 1
  6. 内部阵列有大约40个字段。外部数组可以在显示数据库表时增长很多。 现在我看到随着外部数组越来越大,10级窗口的执行需要越来越多的时间。

    我的代码需要一些“性能理论”:

    如果我通过数字键输入内部数组的值,我可以获得更好的性能吗?通常使用数字索引更快地访问数组值而不是使用关联索引(字符串)访问?

    如何输入长度为N的数组的随机条目($ array [random_num])?例如O(N),O(N / 2)

    最后,迭代数组的速度取决于数组长度?我的意思是我总是迭代数组的10个元素,但数组长度如何影响我的固定长度迭代?

    由于 阿尔贝托

2 个答案:

答案 0 :(得分:8)

  

如果我通过数字键输入内部数组的值,我可以   更好的性能?通常更快地访问数组值   使用数字索引比使用关联索引(字符串)访问?

基于整数和基于字符串的访问可能存在理论上的速度差异(它取决于整数值的散列函数与字符串值的散列函数的作用,我还没有读取PHP源来获得明确的答案),但它肯定可以忽略不计。

  

如何输入随机条目($ array [random_num])   长度为N的数组?例如O(N),O(N / 2)

PHP中的数组是通过哈希表实现的,这意味着插入是分摊的O(1) - 几乎所有的插入都是O(1),但有些可能是O(n)。顺便说一下,O(n)和O(n / 2)是一样的;您可能想重新阅读有关算法复杂性的文本。

  

最后,迭代数组的速度取决于数组   长度?我的意思是我总是迭代数组的10个元素,但是如何   数组长度是否影响我的固定长度迭代?

不,数组长度不是一个因素。

性能下降不是因为您访问阵列的方式,而是因为您似乎正在从数据库加载所有记录,只是为了处理其中的10个。

您应该通过在SQL查询中包含偏移量和限制来将分页逻辑移动到数据库本身。

答案 1 :(得分:3)

过早优化是万恶之源。附加的数字和关联数组具有非常不同的语义含义,因此通常不可互换。最后但并非最不重要的一点:PHP中的数组实现为Hashmaps,按键访问它们总是O(1)

在你的情况下(分页),仅获取你想要显示的项目而不是获取所有项目并稍后切片它们会更有用。 SQL具有LIMIT 10 OFFSET 20 - 语法。