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 'ByValFun: ', $end - $start, 's' , PHP_EOL, 'Mem: ', $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 'ByRefFun: ', $end - $start, 's' , PHP_EOL, 'Mem: ', $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 'ByValFun: ', $end - $start, 's' , PHP_EOL, 'Mem: ', $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 'ByRefFun: ', $end - $start, 's' , PHP_EOL, 'Mem: ', $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 'ByVal: ', $end - $start, 's' , PHP_EOL, 'Mem: ', $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 'ByRef: ', $end - $start, 's' , PHP_EOL, 'Mem: ', $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 'ByVal: ', $end - $start, 's' , PHP_EOL, 'Mem: ', $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 'ByRef: ', $end - $start, 's' , PHP_EOL, 'Mem: ', $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 'ByKey: ', $end - $start, 's' , PHP_EOL, 'Mem: ', $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 'ByRef: ', $end - $start, 's' , PHP_EOL, 'Mem: ', $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 'ByKey: ', $end - $start, 's' , PHP_EOL, 'Mem: ', $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 'ByRef: ', $end - $start, 's' , PHP_EOL, 'Mem: ', $endMem - $startMem , PHP_EOL; // END: 传值胜出 // 总结:数据需要修改的就用引用,数据不需要修改的就用非引用
Recommandations associées :
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!