Maison  >  Article  >  développement back-end  >  Comparaison des performances de référence et de non-référence des variables PHP

Comparaison des performances de référence et de non-référence des variables PHP

小云云
小云云original
2018-03-21 15:22:061954parcourir

Cet article partage principalement avec vous la comparaison des performances des références et non-références de variables PHP. J'espère qu'il pourra aider tout le monde.

<?php
// PREVIEW:数据需要修改的就用引用,数据不需要修改的就用非引用

$arrayCount = 2000;
$cycleCount = 100000;

// 向函数传递参数并做修改
echo "向函数传递参数并做修改", PHP_EOL;
function ByVal($p){return $p[intval(count($p) / 2)] += 1;}  
function ByRef(&$p){return $p[intval(count($p) / 2)] += 1;}

$p = array_fill(0, $arrayCount, 1);
$start = microtime(true);
$startMem = Memory_get_usage();
for($i = 0; $i < $cycleCount; $i += 1){
    $a = ByVal($p);
}
$end = microtime(true);
$endMem = Memory_get_usage();
echo &#39;ByValFun: &#39;, $end - $start, &#39;s&#39; , PHP_EOL, &#39;Mem: &#39;, $endMem - $startMem , PHP_EOL;

$start = microtime(true);
$startMem = Memory_get_usage();
for($i = 0; $i < $cycleCount; $i += 1){
    $a = ByRef($p);
}
$end = microtime(true);
$endMem = Memory_get_usage();
echo &#39;ByRefFun: &#39;, $end - $start, &#39;s&#39; , PHP_EOL, &#39;Mem: &#39;, $endMem - $startMem , PHP_EOL , PHP_EOL;
// END: 速度相近,内存引用胜出

// 向函数传递参数不做修改
echo "向函数传递参数不做修改", PHP_EOL;
function ByVal2($p){return $p[intval(count($p) / 2)];}  
function ByRef2(&$p){return $p[intval(count($p) / 2)];}

$p = array_fill(0, $arrayCount, 1);
$start = microtime(true);
$startMem = Memory_get_usage();
for($i = 0; $i < $cycleCount; $i += 1){
    $a = ByVal2($p);
}
$end = microtime(true);
$endMem = Memory_get_usage();
echo &#39;ByValFun: &#39;, $end - $start, &#39;s&#39; , PHP_EOL, &#39;Mem: &#39;, $endMem - $startMem , PHP_EOL;

$start = microtime(true);
$startMem = Memory_get_usage();
for($i = 0; $i < $cycleCount; $i += 1){
    $a = ByRef2($p);
}
$end = microtime(true);
$endMem = Memory_get_usage();
echo &#39;ByRefFun: &#39;, $end - $start, &#39;s&#39; , PHP_EOL, &#39;Mem: &#39;, $endMem - $startMem , PHP_EOL , PHP_EOL;
// END: 传值性能大幅胜出,内存相近

// 变量赋值做修改
echo "变量赋值做修改", PHP_EOL;
$start = microtime(true);
$startMem = Memory_get_usage();
for($i = 0; $i < $cycleCount; $i += 1){
    $p = array_fill(0, $arrayCount, 1);
    $a = $p;
    $a[2] += 1;
}
$end = microtime(true);
$endMem = Memory_get_usage();
echo &#39;ByVal: &#39;, $end - $start, &#39;s&#39; , PHP_EOL, &#39;Mem: &#39;, $endMem - $startMem , PHP_EOL;

$start = microtime(true);
$startMem = Memory_get_usage();
for($i = 0; $i < $cycleCount; $i += 1){
    $p = array_fill(0, $arrayCount, 1);
    $a = &$p;
    $a[2] += 1;
}
$end = microtime(true);
$endMem = Memory_get_usage();
echo &#39;ByRef: &#39;, $end - $start, &#39;s&#39; , PHP_EOL, &#39;Mem: &#39;, $endMem - $startMem , PHP_EOL , PHP_EOL;
// END 速度相近,引用略胜;内存引用大幅胜出

// 变量赋值不做修改
echo "变量赋值不做修改", PHP_EOL;
$start = microtime(true);
$startMem = Memory_get_usage();
for($i = 0; $i < $cycleCount; $i += 1){
    $p = array_fill(0, $arrayCount, 1);
    $a = $p;
    $b = $a[2];
}
$end = microtime(true);
$endMem = Memory_get_usage();
echo &#39;ByVal: &#39;, $end - $start, &#39;s&#39; , PHP_EOL, &#39;Mem: &#39;, $endMem - $startMem , PHP_EOL;

$start = microtime(true);
$startMem = Memory_get_usage();
for($i = 0; $i < $cycleCount; $i += 1){
    $p = array_fill(0, $arrayCount, 1);
    $a = &$p;
    $b = $a[2];
}
$end = microtime(true);
$endMem = Memory_get_usage();
echo &#39;ByRef: &#39;, $end - $start, &#39;s&#39; , PHP_EOL, &#39;Mem: &#39;, $endMem - $startMem , PHP_EOL , PHP_EOL;
// END 速度相近,内存相近

// 数组内循环赋值修改数据
echo "数组内循环赋值修改数据", PHP_EOL;
$start = microtime(true);
$startMem = Memory_get_usage();
for($i = 0; $i < $cycleCount; $i += 1){
    $p = array_fill(0, $arrayCount, 1);
    foreach($p as $key => $val){
        $p[$key] += 1;
    }
}
$end = microtime(true);
$endMem = Memory_get_usage();
echo &#39;ByKey: &#39;, $end - $start, &#39;s&#39; , PHP_EOL, &#39;Mem: &#39;, $endMem - $startMem , PHP_EOL;

$start = microtime(true);
$startMem = Memory_get_usage();
for($i = 0; $i < $cycleCount; $i += 1){
    $p = array_fill(0, $arrayCount, 1);
    foreach($p as &$val){
        $val += 1;
    }
}
$end = microtime(true);
$endMem = Memory_get_usage();
echo &#39;ByRef: &#39;, $end - $start, &#39;s&#39; , PHP_EOL, &#39;Mem: &#39;, $endMem - $startMem , PHP_EOL , PHP_EOL;
// END: 引用胜出

// 数组内循环赋值不修改数据
echo "数组内循环赋值不修改数据", PHP_EOL;
$start = microtime(true);
$startMem = Memory_get_usage();
for($i = 0; $i < $cycleCount; $i += 1){
    $p = array_fill(0, $arrayCount, 1);
    foreach($p as $key => $val){
        $b = $val;
    }
}
$end = microtime(true);
$endMem = Memory_get_usage();
echo &#39;ByKey: &#39;, $end - $start, &#39;s&#39; , PHP_EOL, &#39;Mem: &#39;, $endMem - $startMem , PHP_EOL;

$start = microtime(true);
$startMem = Memory_get_usage();
for($i = 0; $i < $cycleCount; $i += 1){
    $p = array_fill(0, $arrayCount, 1);
    foreach($p as &$val){
        $b = $val;
    }
}
$end = microtime(true);
$endMem = Memory_get_usage();
echo &#39;ByRef: &#39;, $end - $start, &#39;s&#39; , PHP_EOL, &#39;Mem: &#39;, $endMem - $startMem , PHP_EOL;
// END: 传值胜出

// 总结:数据需要修改的就用引用,数据不需要修改的就用非引用

Recommandations associées :

Explication détaillée des trois exemples de codes de référence de référence de variable PHP, de référence de fonction et de référence d'objet

Référence de variable PHP, référence de fonction, référence d'objet

Référence de variable PHP Variable globale PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn