PHP:func_get_args性能?

PHP:func_get_args性能?,php,performance,Php,Performance,我将使用func\u get\u args读取函数调用的附加参数 这对性能有何影响?我是否应该使用数组来传递额外的参数,而不是使用上面的函数来读取它们?我认为您的性能不会有明显的不同;这实际上取决于偏好 “无论什么东西能让你的船漂浮”除非你大量使用它,否则没有一个单一的功能会有这么大的不同。您可以在调用前后使用microtime()检查调用所需的时间,但我认为您不会发现任何有趣的事情 如果你愿意,就用吧 我更担心的是确保其他程序员了解函数的工作原理,知道他们可以向函数传递任意数量的参数。据我所知

我将使用
func\u get\u args
读取函数调用的附加参数


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

我认为您的性能不会有明显的不同;这实际上取决于偏好


“无论什么东西能让你的船漂浮”

除非你大量使用它,否则没有一个单一的功能会有这么大的不同。您可以在调用前后使用
microtime()
检查调用所需的时间,但我认为您不会发现任何有趣的事情

如果你愿意,就用吧


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

据我所知,只有这两种可能性。func_get_args是从我的观点来看的更干净的方式。 我将此代码段与解析器(func_参数)结合使用,以获得额外的灵活性。这只是一个小的性能降低。可能不值得注意

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

    $parameter = func_get_args();
    $parameter = $this->func_parameter("key,data,dispense=",$parameter);
    extract($parameter);
我应该使用数组来传递额外的参数,而不是用上面的函数读取它们吗

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

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

function foo() { list($a) = func_get_args(); }
foo(); //no error
此外,当您看到
foo($a)
时,您立即知道要传递什么


使用
func\u get\u args
的唯一原因是当您想要一个具有任意数量参数的函数(类似printf)时。

我运行了这段代码,并且使用了一个使用
func\u get\u args
func\u num\u 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在单引号和双引号之间仍然存在运行时性能差异?+1,因为如果您开始考虑它,您应该重新考虑PHP是否是有关性能的正确决策。如果不知道您运行此操作所针对的PHP版本,以及一些计时、机器规格等证据,这不是一个真正有用的答案。添加了PHP版本,这是迄今为止最接近OP的答案。
<?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;
}

?>