Re: Re: 1 last error to fix before the application is done!
| From: | Andrew Ballard | Date: | Tue, 14 Oct 2008 13:49:29 +0000 |
| Subject: | Re: Re: 1 last error to fix before the application is done! | ||
| References: | 1 2 3 4 5 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-281870@lists.php.net to get a copy of this message | ||
On Tue, Oct 14, 2008 at 8:52 AM, Colin Guthrie <gmane@colin.guthr.ie> wrote:
> Yeti wrote:
>>
>> You might also want to try array_key_exists
>>
>> if (array_key_exists('loggedin', $_SESSION['userInfo'])) {
>> // do something with $_SESSION['userInfo']['loggedin']
>> }
>
> You'd first need to check that the key 'userInfo' existed in the $_SESSION
> array too.
>
> Personally, I very rarely see the point in using array_key_exists... It's a
> function call and has overhead where as isset() and empty() are language
> constructs and (I would hope) are much more efficient (although I've not
> done any benchmarks).
>
I've heard that a lot, but I just don't see it. I'm sure some of you
can come up with better tests than this, but here is what I used:
<?php
// Load some big arrays
$x = get_defined_functions();
$x = $x['internal'];
$x += get_defined_constants();
$iterations = 50000;
for ($i = 0, $start = microtime(true); $i < $iterations; ++$i) {
isset($x[rand()]);
}
$elapsed = microtime(true) - $start;
$avg = $elapsed / $iterations;
echo "Completed $iterations iterations using isset() in $elapsed seconds.\n";
echo "Average time per function call: $avg\n\n";
for ($i = 0, $start = microtime(true); $i < $iterations; ++$i) {
empty($x[rand()]);
}
$elapsed = microtime(true) - $start;
$avg = $elapsed / $iterations;
echo "Completed $iterations iterations using empty() in $elapsed seconds.\n";
echo "Average time per function call: $avg\n\n";
for ($i = 0, $start = microtime(true); $i < $iterations; ++$i) {
array_key_exists(rand(), $x);
}
$elapsed = microtime(true) - $start;
$avg = $elapsed / $iterations;
echo "Completed $iterations iterations using array_key_exists() in
$elapsed seconds.\n";
echo "Average time per function call: $avg\n\n";
?>
Sample Results:
Completed 50000 iterations using isset() in 1.6928939819336 seconds.
Average time per function call: 3.3857879638672E-005
Completed 50000 iterations using empty() in 1.6825141906738 seconds.
Average time per function call: 3.3650283813477E-005
Completed 50000 iterations using array_key_exists() in 1.7125430107117 seconds.
Average time per function call: 3.4250860214233E-005
Based on these results, I'd hardly use the "language construct versus
function call" optimization argument to make my decision. I'm not sure
if this is a testament to improvements in the PHP engine over the last
couple years, or if equipment has gotten fast enough that the
differences have become irrelevant. Quite possibly, it's both.
Andrew