我正在开发一个项目,我必须在PHP中对数据数组执行计算。其中一些计算涉及使用多个数组。所有都是相同的长度(计数)。
问题:将数据放入多维数组或保留在两个数组中是否更有效(内存和处理器使用率)。
请记住,其中一些数组可能有数千个值。
示例:为了更好地说明,以下是数据和用法的示例:
X = 1,2,3,4,5
Y = 2,3,3,4,4
计算X和Y之间的相关性。
要做到这一点:
我的想法: 将两个数组组合成一个多维数组将允许更少的迭代计算,但它们需要首先组合。
因此,我的主要关注点和理由是,创建一个多维数组需要花费更少的资源并对其进行1次迭代,或者更好地将它们分开并迭代每一个 - 进行2次迭代。
或者是否有更好的方法对不涉及迭代的数组执行计算?
答案 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)
我无法看到二维数组或两个一维数组之间的处理器或内存有何不同。应该使用相同数量的内存。他们都会有相同的数字或元素吗?