拥有多个数组或一个多维数组会更好吗?

时间:2010-11-18 17:15:16

标签: php arrays

我正在开发一个项目,我必须在PHP中对数据数组执行计算。其中一些计算涉及使用多个数组。所有都是相同的长度(计数)。

问题:将数据放入多维数组或保留在两个数组中是否更有效(内存和处理器使用率)。

请记住,其中一些数组可能有数千个值。

示例:为了更好地说明,以下是数据和用法的示例:

X = 1,2,3,4,5

Y = 2,3,3,4,4

计算X和Y之间的相关性。

要做到这一点:

  1. 从列中获取X和Y的总和
  2. 从列
  3. 获取X ^ 2和Y ^ 2的总和
  4. 然后使用相关公式计算
  5. 我的想法: 将两个数组组合成一个多维数组将允许更少的迭代计算,但它们需要首先组合。

    因此,我的主要关注点和理由是,创建一个多维数组需要花费更少的资源并对其进行1次迭代,或者更好地将它们分开并迭代每一个 - 进行2次迭代。

    或者是否有更好的方法对不涉及迭代的数组执行计算?

5 个答案:

答案 0 :(得分:3)

如果你已经将数据作为两个独立的数组,首先将它们合并将浪费我想象的时间和资源。

PHP中有两种形式的数组访问,迭代,它使用内部指针,并通过关联的键/索引顺序访问,这是一个哈希映射而不是顺序。如果你要查看数组的所有元素并且可以按顺序执行,那么尝试使用内置的array_函数或迭代器函数reset(),next(),cur()迭代访问它。 ,end(),each()。

看看PHP中的array_reduce()函数,它可以帮助您快速实现这类功能。虽然在这个简单的情况下你可能最好做一个直接for()循环并使用数组迭代器函数reset(),next(),cur()来获取每个数组的值 - 或者如果它们被相同地键入它们你可以只执行一个foreach()并将一个键用于另一个。

$sum_x = array_reduce($x, create_function('$x1,$x2', 'return $x1 + $x2;'), 0);
$sum_y = array_reduce($y, create_function('$y1,$y2', 'return $y1 + $y2;'), 0);
$sum_x2 = array_reduce($x, create_function('$x1,$x2', 'return $x1 + $x2 * $x2;'), 0);
$sum_y2 = array_reduce($y, create_function('$y1,$y2', 'return $y1 + $y2 * $y2;'), 0);

$sum_x = 0;
$sum_y = 0;
$sum_x2 = 0;
$sum_y2 = 0;

foreach (array_keys($x) as $i) {
  $sum_x += $x[$i];
  $sum_y += $y[$i];
  $sum_x2 += $x[$i] * $x[$i];
  $sum_y2 += $y[$i] * $y[$i];
}

答案 1 :(得分:1)

考虑到PHP中的所有数组都是哈希表和关联,我认为最大的性能增益是迭代次数减少。我会使用多维数组。

答案 2 :(得分:1)

写一个测试用例?您可以使用PEAR来确定:http://pear.php.net/package/Benchmark

答案 3 :(得分:1)

这不是特定于PHP的。 Locality of reference数据通常很重要,因为缓存未命中是很昂贵的。

例如,如果您正在处理并行数组中的项目(所有?1,然后是所有?2 ...),则将它们组织在内存中会更有效:

A1 B1 C1 ... A2 B2 C2 ... A3 B3 C3 ...

而不是典型的:

A1 A2 A3 ... B1 B2 B3 ... C1 C2 C3 ...

当然,这取决于您的具体计算方法。将数据加载到第一个布局可能需要相当长的时间。最后,分析是确定的唯一方法。

答案 4 :(得分:0)

我无法看到二维数组或两个一维数组之间的处理器或内存有何不同。应该使用相同数量的内存。他们都会有相同的数字或元素吗?

相关问题