PHP:func_get_args性能如何?

时间:2010-08-20 15:33:11

标签: php performance

我将使用func_get_args来读取函数调用的其他参数。

这对性能有何影响?我是否应该使用数组来传递其他参数,而不是使用上面的函数读取它们?

5 个答案:

答案 0 :(得分:12)

除非您大量使用它,否则没有任何单一功能可以产生那么大的差异。您可以随时在通话前后使用microtime()查看通话时间,但我认为您不会发现任何有趣的内容。

如果您愿意,请继续使用它。

我更担心的是确保其他程序员了解该函数的工作原理并知道他们可以将任意数量的参数传递给函数。

答案 1 :(得分:4)

  

我是否应该使用数组传递其他参数而不是使用上面的函数读取它们?

是的,但更多的原因是清晰度和代码正确性,而不是性能。例如:

function foo($a) { }
foo(); // Warning: Missing argument 1 for foo()

function foo() { list($a) = func_get_args(); }
foo(); //no error

此外,当您看到foo($a)时,您立即知道要传递的内容。

使用func_get_args的唯一原因是你想要一个具有任意数量参数的函数(类似printf)。

答案 2 :(得分:1)

我认为你的表现不会明显不同;它真的归结为偏好。

“随便漂浮你的船”

答案 3 :(得分:1)

据我所知,只有这两种可能性。 func_get_args来自我的pov更干净的方式。 我大量使用这个代码片段与解析器(func_parameter)来获得额外的灵活性。只有很小的性能降低。可能不值得注意。

这就像双引号和单引号之间的性能问题。如果你开始考虑它,你应该重新考虑PHP是否是性能决定的正确决定。

    $parameter = func_get_args();
    $parameter = $this->func_parameter("key,data,dispense=",$parameter);
    extract($parameter);

答案 4 :(得分:-2)

我运行此代码并使用使用func_get_argsfunc_num_args的函数似乎更贵......

php -v:

PHP 5.3.10-1ubuntu3.2 with Suhosin-Patch (cli) (built: Jun 13 2012 17:20:55) 
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
Output: 
php dynFuncArgListTest.php 
$StatTestTot: 14.194619178772
$DynTestTot: 33.246332645416

代码:

<?php

define('NEWLINE', "\n");

$StatTestTot = 0;
$DynTestTot = 0;

for($i = 0; $i < 9000; ++$i) {
    $randBoolArr = CreateArrayWithRandomBoolValues(900);
    $StatTestTot += StatTest($randBoolArr);
    $DynTestTot += DynTest($randBoolArr);
    $StatTestTot += StatTest($randBoolArr);
    $DynTestTot += DynTest($randBoolArr);
    $StatTestTot += StatTest($randBoolArr);
    $DynTestTot += DynTest($randBoolArr);
    $StatTestTot += StatTest($randBoolArr);
    $DynTestTot += DynTest($randBoolArr);
}

echo '$StatTestTot: ' . $StatTestTot . NEWLINE;
echo '$DynTestTot: ' . $DynTestTot . NEWLINE;

function DynTest($randBoolArr) {
    $StartDynTest = GetMicrotimeTrue();
    foreach($randBoolArr as $aBool) {
        IsBoolAndTrueDyn($aBool);
    }
    $EndDynTest = GetMicrotimeTrue();
    $Dyndisplacement = $EndDynTest - $StartDynTest;
    //echo 'Dyn Test: ' . $Dyndisplacement . NEWLINE;
    return $Dyndisplacement;
}

function StatTest($randBoolArr) {
    $StartStatTest = GetMicrotimeTrue();
    foreach($randBoolArr as $aBool) {
        IsBoolAndTrue($aBool);
    }

    $EndStatTest = GetMicrotimeTrue();
    $Statdisplacement = $EndStatTest - $StartStatTest;
    //echo 'Stat Test: ' . $Statdisplacement . NEWLINE;
    return $Statdisplacement;
}


function GetMicrotimeTrue() { return microtime(true); }

function CreateArrayWithRandomBoolValues($size) {
    $output = array();
    for($i = 0; $i < $size; ++$i) {
        $output[$i] = (rand(0, 1) === 0);
    }
    return $output;
}

function IsBoolAndTrue($input) {
    if(!is_bool($input) || $input !== true) { 
        return false;
    }
    return true;
}

function IsBoolAndTrueDyn() {
    $num_args = func_num_args();
    if($num_args > 0) {
        $args = func_get_args();
        foreach($args as $arg) {
            if(!is_bool($arg) || $arg !== true) {
                return false;
            }
        }
        return true;
    }
    return false;
}

?>