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;
}
?>