2011-04-29 2 views
76

count()은 실제로 PHP 배열의 모든 요소를 ​​계산합니까? 아니면이 값을 어딘가에 캐시하고 검색 만 받습니까?배열에 대해 PHP의 count() 함수는 O (1) 또는 O (n)입니까?

+6

왜 테스트하지 않습니까? 요소를 배열에 추가하고 매번 카운트하고 타이밍을 수행하는 루프를 수행하는 것은 간단합니다. –

+2

이 질문을보십시오 : http://stackoverflow.com/questions/2473989/list-of-big-o-for-php-functions –

+0

Google 키워드 -이 질문은 다음과 같이 공식화 될 수도 있습니다 : PHP count() 배열을 반복하거나 배열 속성에서 개수를 검색합니까? –

답변

103

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

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

    return ht->nNumOfElements; 
} 

: 결과적으로이 방법을 구현 비 재귀 배열에 대한 zend_hash_num_elements()를 호출

/ext/standard/array.c

PHP_FUNCTION(count) 전화 php_count_recursive()을, 그러면 알 수 있듯이 의 경우 O(1)입니다.

+5

'IS_CONSISTENT (ht)'는 어떻게합니까? – Matthew

+1

감사합니다. 소스에서 어디에서 소스를 가져야하는지 (리포지토리에서 체크하지 않고도) 소스를 어디에서보아야하는지 잘 모르겠습니다. – Dexter

+3

@Matt 해시 구조가 유효한지 확인하고 있습니다. 그것은 zend_hash.c에 정의되어 있으며 O (1)도 있습니다. –

6

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

편집 : 흥미로운 분석 결과가 나타날 수도 있습니다 : PHP Count Performance. 어레이의 길이는 배열에 의해 유지되지만, count() 번을 여러 번 호출하는 경우에는 더 빨리 기다리는 것처럼 보입니다.

+0

PHP 5부터 시작하여 변경이 이루어 졌다는 것이 맞을 수도 있습니다. 그러나 PHP 4가 count()에 대한 O (n)이라는 증거는 아직 발견하지 못했습니다. 나는 단지 일화적인 코멘트를 본다. PHP 4의 count() 구현과 같은 증명을 찾을 수 있습니까? 고마워요, –

3

PHP는 배열의 크기를 내부적으로 저장하지만, 함수 호출을하지 않는 것보다 느린 경우 함수 호출을하고 있으므로, 뭔가를하면 변수에 결과를 저장하는 것이 좋습니다. 루프에서 사용 :

예를 들어

,

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

을 추가, 당신은 항상 count이 배열에 호출되고 확신 할 수 없다. 예를 들어 Countable을 구현하는 객체에서 호출되면 해당 객체의 count 메서드가 호출됩니다.

+0

후속 조치로 http://josephscott.org/archives/2010/01/php-count-performance/을 읽으십시오. 기본적으로 배열 길이를 가져 오는 방법은 o (1)이며 반복되는 함수 호출. – TheClair

+0

은 함수 호출을하지 않을 때보 다 항상 느리게 호출하고 있습니까? 나는 인터프리터가 인라인 최적화를 찾도록 놀라지 않을 것이다. – corsiKa

+1

'그 객체의 카운트 메소드가 호출됩니다', 당신이 조금 설명해 주시겠습니까 –