PHP массив: count или sizeof?


216

Чтобы найти количество элементов в PHP $array, что быстрее / лучше / сильнее?

count($array)или sizeof($array)?

редактировать

Благодаря Энди Лестеру я уточнил свой вопрос с точки зрения многоязычия. Руководство комментаторов говорит

«[sizeof] не означает то же самое во многих других языках, основанных на C»

Это правда?


72
Ссылка на Daft Punk ... :)
Бен

2
Очень хороший вопрос. Но вот хороший тестовый сайт, который говорит, что sizeof быстрее всего на 21 мкс
sinaneker

Ответы:


191

Я хотел бы использовать, count()если они одинаковы, так как по моему опыту, это более распространено, и поэтому заставит меньше разработчиков читать ваш код, чтобы сказать " sizeof()что это?" и необходимость ознакомиться с документацией.

Я думаю, что это означает, sizeof()что не работает, как это работает в C (вычисление размера типа данных). Вероятно, он сделал это в явном виде, потому что PHP написан на C, и предоставляет множество оболочек с одинаковыми именами для функций C ( strlen(), printf()и т. Д.)


92

По словам phpbench :

Стоит ли усилий заранее рассчитать длину цикла?

//pre-calculate the size of array
$size = count($x); //or $size = sizeOf($x);

for ($i=0; $i<$size; $i++) {
    //...
}

//don't pre-calculate
for ($i=0; $i<count($x); $i++) { //or $i<sizeOf($x);
    //...
}

Дан цикл с 1000 ключами с 1 байтовыми значениями.

                  +---------+----------+
                  | count() | sizeof() |
+-----------------+---------+----------+
| With precalc    |     152 |      212 |
| Without precalc |   70401 |    50644 |
+-----------------+---------+----------+  (time in µs)

Поэтому я лично предпочитаю использовать count () вместо sizeof () с pre calc .


3
Пожалуйста, сообщите только то, что занимает меньше времени. Иначе ответ довольно сложный и запутанный тоже! Спасибо
Пратик

6
с какой версией php вы тестировали? Более новые версии имеют много оптимизаций, которые могут сделать эти результаты совершенно разными
Джон Хант

4
почему sizeof быстрее без сохранения его результата в переменную, а в противном случае все наоборот? это плохой выбор дизайна в интерпретаторе php, который вызывает какие-то выборочные издержки? Я хотел бы знать, как вы отметили это, микросекундное измерение меня беспокоит. может быть, попробовать запустить это огромное количество раз во внешнем цикле for?
FluorescentGreen5

1
что ты имеешь ввиду под "pre calc"?
rubo77

1
@ rubo77 Посмотрите код выше; «pre-calc» определяет размер массива один раз, перед циклом for. Без «pre-calc» определяется размер массива внутри цикла for
RobIII

38

Они идентичны согласно sizeof()

При отсутствии каких-либо причин беспокоиться о «быстрее», всегда оптимизировать для человека. Что имеет больше смысла для читателя?


19

По данным сайта, sizeof()это псевдоним count(), поэтому они должны запускать один и тот же код. Возможно, sizeof()имеет немного накладных расходов, потому что это нужно разрешить count()? Это должно быть очень минимальным, хотя.


53
Ну, извините за угадывание? Я просто заявлял, что они на самом деле одно и то же. Затем я сделал логический вывод, что использование псевдонима для функции вместо фактической функции может быть очень минимально медленным, но я восхищен тем, что я действительно понятия не имею, предварительно связав его словом «возможно». Извините, если это вас обидело. Может быть, в следующий раз я буду использовать слово «бесконечно мало».
Энди Грофф,

8

Я знаю, что это старый, но просто хотел упомянуть, что я попробовал это с PHP 7.2:

<?php
//Creating array with 1 000 000 elements
$a = array();
for ($i = 0; $i < 1000000; ++$i)
{
    $a[] = 100;
}

//Measure
$time = time();
for ($i = 0; $i < 1000000000; ++$i)
{
    $b = count($a);
}
print("1 000 000 000 iteration of count() took ".(time()-$time)." sec\n");

$time = time();
for ($i = 0; $i < 1000000000; ++$i)
{
    $b = sizeof($a);
}
print("1 000 000 000 iteration of sizeof() took ".(time()-$time)." sec\n");
?>

и результат был:

1 000 000 000 iteration of count() took 414 sec
1 000 000 000 iteration of sizeof() took 1369 sec

Так что просто используйте count().


Это интересно. Какую версию PHP вы используете?
Ваза

@waza Я использую PHP 7.2
Мехди Боунья

1
С PHP 7.3.3: 1 000 000 000 iteration of count() took 525 sec 1 000 000 000 iteration of sizeof() took 1361 sec
AnthonyB


-2

Пожалуйста, используйте функцию подсчета, вот пример, как посчитать массив в элементе

$cars = array("Volvo","BMW","Toyota");
echo count($cars);

count()Функция возвращает количество элементов в массиве.

sizeof()Функция возвращает количество элементов в массиве.

sizeof()Функция является псевдонимом count()функции.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.