вторник, 12 февраля 2013 г.

Что быстрее - sizeof() или count()

В среде программистов на PHP, особенно не очень опытных, имеется легенда о том, что sizeof() и count() - на самом деле разные функции, несмотря на то, что написано в мануале, и на маленьких массивах одна быстрее, а на больших - другая. Я решил положить конец этим бредням и убедить себя в том, что это одна и та же функция, и полез копаться в исходниках PHP. Исходный код функции count() я нашёл быстро, а вот sizeof() - не нашёл :(

Поэтому решить этот вопрос я додумался тупо в лоб (как обычно решают все вопросы PHP-программисты - я написал speed-тест.
<?php

define('ARSIZE', (int)$argv[1] ? (int)$argv[1] : 10);

$sum = 0;
$a   = array();
for($i = 0; $i < 1000; $i++)
{
    $start = microtime(true);
    for($j = 0; $j < ARSIZE; $j++)
    {
        $a[$j] = sizeof($a);
    }
    $sum += microtime(true) - $start;
}
echo 'sizeof median time '.round($sum / 1000, 6)."\n";

$sum = 0;
$a   = array();
for($i = 0; $i < 1000; $i++)
{
    $start = microtime(true);
    for($j = 0; $j < ARSIZE; $j++)
    {
        $a[$j] = count($a);
    }
    $sum += microtime(true) - $start;
}
echo 'count median time '.round($sum / 1000, 6)."\n";

?>
Версия PHP 5.4.4, версия ОС Linux 3.2.0 Linux Mint Debian i686 (то есть 32-битная архитектура). Процессор Intel Pentium T2080, тактовая частота 1.73 ГГц (это мой ноутбук). Результат выполнения теста:
$ php test.php 100
sizeof median time 5.0E-5
count median time 4.9E-5

$ php test.php 1000
sizeof median time 0.000474
count median time 0.000479

$ php test.php 5000
sizeof median time 0.002369
count median time 0.002373

$ php test.php 10000
sizeof median time 0.004776
count median time 0.004777

$ php test.php 20000
sizeof median time 0.009542
count median time 0.009572

$ php test.php 50000
sizeof median time 0.023856
count median time 0.023878
Как видите, скорость выполнения одна и та же. Так что использовать sizeof() или count() - только дело вкуса. Мне то внешне нравится, как написано sizeof, тут и буква s такая красивая, и f тоже неплохая, и даже z присутствует в середине, придавая особый смак. Поэтому я пользуюсь sizeof().

1 комментарий:

  1. Ничего, сделают LINQ в каком-нибудь уже шестом пхп - будет чего поизмерять :)

    ОтветитьУдалить

Ублюдочный Гугл поломал форму комментариев. Извините.