PHP의 count () 함수는 O (1) 또는 O (n) 배열입니까?


96

count()실제로 PHP 배열의 모든 요소를 ​​계산 합니까 , 아니면이 값이 어딘가에 캐시되어 검색됩니까?


6
왜 그것을 테스트하지 않습니까? 배열에 요소를 추가하고 매번 계산하고 일부 타이밍을 수행하는 루프를 수행하는 것은 간단합니다.
Marc B


Google 키워드-이 질문은 다음과 같이 공식화 될 수도 있습니다. PHP count ()가 배열을 반복합니까 아니면 배열 속성에서 개수를 검색합니까?
jave.web

답변:


136

음, 우리는 소스를 볼 수 있습니다.

/ext/standard/array.c

PHP_FUNCTION(count)전화 php_count_recursive()차례로 호출 zend_hash_num_elements()이 방법을 구현 비 재귀 배열을 위해 :

ZEND_API int zend_hash_num_elements(const HashTable *ht)
{
    IS_CONSISTENT(ht);

    return ht->nNumOfElements;
}

당신이 볼 수 있도록, 그건 O(1)위해 $mode = COUNT_NORMAL.


6
무엇 않습니다 IS_CONSISTENT(ht)하지만합니까?
Matthew

1
감사! 소스에서 어디를보아야하는지, 소스를 어디서 구해야할지 (저장소에서 확인할 필요없이) 확실하지 않았습니다.
Dexter

3
@Matt 내가 볼 수 있듯이 해시 구조가 유효한지 확인하고 있습니다. zend_hash.c에 정의되어 있으며 O (1)이기도합니다.
Vladislav Rastrusny 2011

10
:) 누군가가 PHP의 소스 코드에서 답을 찾고 위해 투표를 놓칠 수 없습니다
라미

1
@ 매트 IS_CONSISTENT는 () 배열에 불과 전성 검사입니다 github.com/php/php-src/blob/PHP-5.3/Zend/zend_hash.c#L51
존 카터

7

PHP 5+에서는 길이가 배열에 저장되므로 매번 계산이 수행되지 않습니다.

편집 :이 분석이 흥미로울 수도 있습니다 : PHP Count Performance . 배열의 길이는 배열에 의해 유지되지만 count()여러 번 호출 할 경우 보유하는 것이 더 빠른 것처럼 보입니다 .


PHP 5부터 변경이 이루어 졌다는 것이 정확하다고 생각합니다. 그러나 아직은 count (); 나는 단지 일화적인 코멘트를 본다. 증명 (즉, PHP 4의 count () 구현)을 찾을 수 있습니까? 감사합니다.
Kristopher Windsor

3

PHP는 배열의 크기를 내부적으로 저장하지만, 생성하지 않는 것보다 느린 경우에도 여전히 함수 호출을 수행하고 있습니다. 고리:

예를 들면

$cnt = count($array);
for ($i =0; $i < $cnt; $i++) {
   foo($array[$i]);
}

또한 count배열에서 호출되고 있는지 항상 확인할 수는 없습니다 . Countable예를 들어 구현하는 객체에서 호출되면 count해당 객체 의 메서드가 호출됩니다.


후속 조치로 josephscott.org/archives/2010/01/php-count-performance 를 읽을 수 있습니다. 기본적으로 배열 길이를 얻는 방법과 반복되는 함수 호출의 영향에 대해 자세히 설명합니다.
TheClair

1
함수 호출을하지 않는 것보다 항상 느린가요? 인터프리터가 인라인 최적화 기능을 가지고 있다는 사실에 놀라지 않을 것입니다.
corsiKa 2011

1
the count method of that object will be called당신이 조금 설명해 수 있습니다
스틸 뇌

1
@SteelBrain 클래스가 Countable인터페이스를 구현하는 경우 호출 은를 호출 count($object)하는 것과 동일 $object->count()합니다. 예를 들어 3v4l.org/oYSSC 를 참조하십시오 .
mfonda 2014-08-05

you're still making a function call when which is slower than not making one이 진술은 틀릴 수 있습니다. 수동 순회를 수행하는 경우 O(n)작동합니다. 그러나 미리 계산 된 값만 검색하려는 경우 작업은 O(1)입니다.
Jamshad Ahmad
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.