2012-06-17 6 views
28

효율성과 관련하여 foreach 루프에서 함수 호출을 사용하는 데 문제가 있습니까? 예를 들어 :foreach 루프에서 함수 호출 사용

foreach ($this->getValues() as $value) { 
    //Do something with $value 
} 

기본적으로

$values = $this->getValues(); 
foreach ($values as $value) { 
    //Do something with $value 
} 

대, 첫 번째 예에서 한 번만) $ this->에 getValues을 (를 호출 할만큼 영리한 PHP는, 또는 각 반복에 전화 않습니다. 이 반복 될 때마다 그것을 호출하는 경우, 어떻게,

+0

* 루프 내에서 모든 작업을 수행하면 효율성이 떨어집니다. – goat

+0

음, 두 번째 접근법의 유일한 단점은 메모리를 차지하는 추가 변수가 필요하다는 것입니다. 그래서 나는 첫 번째 접근 방식을 택할 것입니다. –

+1

부두에서는 "추가 변수"가 실제로 존재하지 않습니다. PHP는 copy-on-write를 사용하는데, 이는'$ values'와 foreach 루프가 같은 데이터 셋을 참조한다는 것을 의미합니다. 고려해야 할 유일한 것은 변수가 가비지 컬렉팅 될 때이다. (루프의 마지막에있는) 첫 번째 예제에서 두 번째 (함수/파일의 끝에 또는'unset 라는). –

답변

32

을하는 요소는 현재의 추적 않는 이들은 모두 본질적으로 동일합니다

foreach ($this->getValues() as $value) { 
// 
} 

$values = $this->getValues(); 
foreach ($values as $value) { 
    // 
} 

는 내부 아니므로 $this->getValues()는 한 번만 실행됩니다 루프 자체. 나중에 getValues의 반환 값을 다시 사용해야 할 경우 함수를 다시 호출 할 필요가 없도록 해당 값을 변수에 할당하십시오. 그렇지 않으면 변수가 실제로 필요하지 않습니다.

+0

따라서, $ this-> getValues ​​()는 단 한 번 호출됩니다. –

+7

맞습니다. 그러나 나는 당신이 "범주 적으로"무엇을 의미하는지 확신 할 수 없습니다. 왜 테스트하지 그래? 'getValues'는 배열을 리턴하기 전에 echo를 사용하여 메시지를 로깅하거나 직접 출력하여, 얼마나 많이 호출되었는지 볼 수있게하십시오. –

15

차이가있을 수 있지만 실제 사례의 99.9 %는 무시할 수 있습니다. 두 경우 모두 PHP는 함수/메소드를 한 번만 호출합니다. foreach을 사용할 때 내부적으로 발생하는 것은 PHP가 iteratee (as 이전 부분)를 한 번 평가하고 그 결과를 저장 한 다음 현재 요소를 as 뒤에 제공된 로컬 변수에 넣는 것입니다. iteratee를 로컬 변수에 직접 작성하면 PHP의 노력을 복제하는 것이므로 첫 번째 방법은 추가 오버 헤드가 발생할 수 있지만 걱정할 정도는 아닙니다. 대신에 가독성을 최적화 할 것입니다 : 함수 호출이 짧고 자체 설명 인 경우, 인라인 it; 복잡하거나 모호한 경우 대신 설명 변수에 저장하십시오.

이 개념을 가지고있는 곳인 일반적인 forwhile 루프에서는 상황이 다릅니다. 예를 들어, 다음 코드 :

for ($number = 0; $number < $this->getNumberOfItems(); ++$number) { 
    // do stuff... 
} 

... getNumberOfItems() 방법은 모든 반복에 호출됩니다. 이 경우 사전 계산하여 로컬 변수에 저장하는 것이 좋습니다.

+0

*라고 말하면 첫 번째 접근 방식은 추가 오버 헤드가 발생할 수 있습니다 * 나는 두 번째 접근 방식을 의미한다고 생각합니다 * – whoan

관련 문제