|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2014-04-24 03:09 UTC] vovan-ve at yandex dot ru
Description:
------------
Casting non-empty array to boolean using (bool) takes a time with respect to array length. There are no reasons for this. This is abnormal.
Any other checks like `if ($array)`, `($array) ?:`, `[] === $array` and so on are not affected.
At least whole PHP 5 is affected by this issue.
Test script:
---------------
$tests = array(
'$empty' => array(),
'$full' => range(1, 1000),
);
$count = 1 * 1000 * 1000;
foreach ($tests as $name => $array) {
printf("%-10s", $name);
$start = microtime(true);
$i = $count;
while ($i-- > 0) {
(bool) $array;
}
$total = microtime(true) - $start;
printf("%6.2F sec. total\n", $total, $total / $count);
}
Actual result:
--------------
$empty 0.15 sec. total
$full 52.03 sec. total
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Nov 07 08:00:02 2025 UTC |
More clear test cases: $tests = array( 'empty' => array(), 'x10' => range(1, 10), 'x100' => range(1, 100), 'x1000' => range(1, 1000), ); Result: empty 0.15 sec. total x10 0.65 sec. total x100 5.14 sec. total x1000 49.91 sec. totalLooks like array is copied while casting: # memory_limit=1G echo "Create array..."; $array = array_fill(0, 10 * 1000 * 1000, null); echo " ok\nCasting..."; $start = microtime(true); (bool) $array; printf(" %.3F sec.\n", microtime(true) - $start); Output: Create array... ok Casting...Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 35 bytes) in ...