【问题标题】:Optimizing big array manipulation in PHP inside a function在函数内部优化 PHP 中的大数组操作
【发布时间】:2021-01-18 03:30:29
【问题描述】:

我想修改一个函数内的一个大数组,所以我很确定我需要在那里使用引用,但我不确定这两个替代方案中哪一个更好(性能更高,但也可能有一些副作用?):

$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
从这些结果来看,根本不使用引用似乎更快!如果使用更快 option1(带返回)。
但在我的本地环境中,使用引用似乎更快(不是那么多)。

编辑 2:
也许ideone.com有问题?因为在这里运行相同:
https://3v4l.org/LaffP
结果是: Opcion1 和 Option2(引用)几乎相等,比按值传递更快

【问题讨论】:

  • 您确定选项 1 中的 & (&$array1) 吗?

标签: php reference


【解决方案1】:

当您执行return $array1;(在第一个选项中)时,它不会复制数组,只会增加引用计数器并返回对同一数组的引用。

即函数的返回值和$array1 将指向内存中的同一个数组。除非您修改其中任何一个:在那一刻,数据将被实际复制。

当您为$results[] = $array1; 赋值时也会发生同样的情况,实际上不会复制任何数据,只是将引用放入$results 的新元素中。

最后,这两个选项具有相同的结果:您将在变量$array1$results 的最后一项中引用相同的数据。因此,这两个选项没有显着的性能差异。

另外,考虑使用本机函数来执行典型操作。例如。 array_merge()

【讨论】:

  • 我不是要合并,只是一个示例代码来显示数组将在函数内部进行修改
【解决方案2】:

代码 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.
}

注意:使用的 method rutime 被以下 stackoverflow 帖子的正确答案复制:Tracking the script execution time in PHP

【讨论】:

    猜你喜欢
    • 2016-02-18
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 2011-09-14
    • 2012-02-29
    • 1970-01-01
    • 2011-02-28
    • 2014-06-14
    相关资源
    最近更新 更多