Я собираюсь использовать func_get_args
для чтения дополнительных аргументов вызова функции.
Как это влияет на производительность? Должен ли я использовать массив для передачи дополнительных аргументов вместо того, чтобы читать их с помощью указанной выше функции?
Если вы не используете его в массовых количествах, ни одна функция не будет иметь такой большой разницы. Вы всегда можете проверить, сколько времени потребуется для вызова, используя microtime()
до и после вызова, но я не думаю, что вы найдете что-нибудь интересное.
Идите и используйте его, если хотите.
Я был бы больше обеспокоен тем, что другие программисты понимают, как работает эта функция, и зная, что они могут передавать любое количество аргументов функции.
Должен ли я использовать массив для передачи дополнительных аргументов вместо того, чтобы читать их с помощью указанной выше функции?
Да, но больше по причине ясности и правильности кода, не столько производительности. Пример:
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-like).
Насколько я знаю, есть только те две возможности. func_get_args от моего pov более чистый путь. Я использую этот фрагмент с синтаксическим анализатором (func_parameter), чтобы получить дополнительную гибкость. Существует лишь небольшое снижение производительности. Наверное, не примечательно.
Это похоже на вопрос о производительности между двойными кавычками и одиночной кавычкой. Если вы начнете думать об этом, вам следует задуматься о том, что PHP – правильное решение в случае производительности.
$parameter = func_get_args(); $parameter = $this->func_parameter("key,data,dispense=",$parameter); extract($parameter);
Я не думаю, что ваша работа будет заметно отличаться; это действительно сводится к предпочтению.
«Независимо от того, что плавает ваша лодка»
Я func_get_args
этот код и использую функцию, которая использует func_get_args
и func_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; } ?>