[英]Optimizing big array manipulation in PHP inside a function
我想修改一个函数内的一个大数组,所以我很确定我需要在那里使用引用,但我不确定这两个替代方案中的哪个更好(性能更高,但也可能有一些副作用?):
$array1 = getSomeBigArray();
$array2 = getAnotherBigArray();
$results[] = combineArrays($array1, $array2);
function combineArrays(&$array1, $array2){
// this is not important, just example of modification
foreach($array2 as $value){
if($value > 0){
$array1[] = $value;
}
}
return $array1; // will returning $array1 make a copy?
}
选项 2:
$array1 = getSomeBigArray();
$array2 = getAnotherBigArray();
combineArrays($array1, $array2);
$results[] = $array1;
function combineArrays(&$array1, $array2){
foreach($array2 as $value){
if($value > 0){
$array1[] = $value;
}
}
// void function
}
编辑:我已经运行了一些测试,现在我更困惑了。
这是测试:
https://ideone.com/v7sepC
从这些结果来看,根本不使用引用似乎更快! 如果使用更快的选项1(带返回)。
但是在我的本地环境中,使用引用似乎更快(不是那么多)。
编辑2:
也许ideone.com有问题? 因为在这里运行相同:
https://3v4l.org/LaffP
结果是: Opcion1 和 Option2(引用)几乎相等并且比按值传递更快
当你return $array1;
(在第一个选项中)它不复制数组,只增加引用计数器并返回对同一数组的引用。
即函数的返回值和$array1
将指向内存中的同一个数组。 除非您修改其中任何一个:在那一刻,数据将被实际复制。
当您为$results[] = $array1;
赋值时,也会发生同样的情况$results[] = $array1;
没有实际复制数据,只有一个引用被放入$results
的新元素中。
最后,两个选项都有相同的结果:您将在变量$array1
和$results
的最后一项中引用相同的数据。 因此,这两个选项没有显着的性能差异。
此外,请考虑使用本机函数来执行典型操作。 例如array_merge()
代码 1:1000000 个值,资源:32
代码 1:10000000 个值,资源:67
代码 2:1000000 个值,资源:27
代码 2:2000000 个值,资源:49
我通过调用计算了系统的资源使用情况
getrusage
代码 2 似乎性能更高。 您可以使用以下代码自己进行一些测试:
<?php
function getSomeBigArray() {
$arr = [];
for ($i=0;$i<2000000;$i++) {
$arr[] = $i;
}
return $arr;
}
function rutime($ru, $rus, $index) {
return ($ru["ru_$index.tv_sec"]*1000 + intval($ru["ru_$index.tv_usec"]/1000))
- ($rus["ru_$index.tv_sec"]*1000 + intval($rus["ru_$index.tv_usec"]/1000));
}
$array1 = getSomeBigArray();
$array2 = getSomeBigArray();
$rustart = getrusage();
$results[] = combineArrays($array1, $array2);
$ru = getrusage();
echo rutime($ru, $rustart, "utime");
function combineArrays(&$array1, $array2){
// The array combining method.
}
注意:使用的方法 rutime由以下 stackoverflow 帖子的正确答案复制: Tracking the script execution time in PHP
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.