2010-02-09 5 views
0

나는이 함수를 마이크로 최적화했다. 루프 외부에서 값이 0인지 루프 내부에서 확인하는 경우 문제가 발생한다. . 어떻게 이러한 루프 내부에서 조건부 논리 (느린)가 없도록 리팩토링 할 것인가? 수천 개의 개체의 루프에서이 조건이 상당히을 느리게하기 때문에루프에서 PHP 최적화 함수

foreach($this->layer[$l]->objs as $obj) 
{ 
    //Horrific code to save 20ms :(
    ($l===0) ? $obj->myfunc_clean($var,$var2) : $obj->myfunc($var,$var2); 
} 

나는 조건 $l===0을 제거해야합니다. 또한 정상적으로 처리 할 필요가있는 함수가 있지만 다른 완료해야 할 때 temp 변수를 해제해야합니다 (l에 따라 0). myfunc 함수에는 아직 더 많은 객체에 대한 반복문이 있으므로 더 많은 조건부 논리를 저장하기 위해 별도의 함수를 호출해야합니다.

메모 : 이것은 조숙 한 최적화처럼 보일 수 있지만 내 응용 프로그램의 경우 1 밀리 초를 절약하면 소중한 시간을 절약 할 수 있습니다 (그 이상이 아닌 경우 약 10,000 회 반복). 너무 조숙 한 최적화에 대한 대답은 모든 악과 그 외의 루트입니다. 이것은 확실히 시기상조가 아닙니다.

+0

내가 이것을 최적화하는 데 무의미하다고 생각하지만, http://www.phpbench.com은 몇 가지 다른 아이디어를 줄 수 있습니다. – Gordon

답변

3

루프 외부에서 테스트를 수행 할 수 없습니까?

if ($l === 0) 
    foreach($this->layer[$l]->objs as $obj) 
     $obj->myfunc_clean($var,$var2); 
else 
    foreach($this->layer[$l]->objs as $obj) 
     $obj->myfunc($var,$var2); 
1

단지 그렇지 않으면 두 개의 루프 다른 답변을 줄 제공, 두 개의 루프

if($l == 0) 
    foreach(...) myfunc_clean 
else 
    foreach(...) myfunc 
1

나의 빠른 입찰

if($l===0) 
{ 
    foreach($this->layer[$l]->objs as $obj) 
    { $obj->myfunc_clean($var,$var2) } 
} 
else 
{ 
    foreach($this->layer[$l]->objs as $obj) 
    { $obj->myfunc($var,$var2) } 
} 
1

나는 루프 동안 조건 변경 있으리라 믿고있어 지 확인 대답.

아마 형식 안전 비교 (===)를하고 있기 때문에 상태가 느릴 수 있습니다. 항상 부울 값을 가진 추가 변수를 도입하여 같은 시간에 설정하면 일반 비교를 사용할 수 있습니다.

하지만 10,000x 배의 비교가 문제가되는지 의심 스럽습니다. 아마도 더 많은 시간을 실행할 다른 함수 내부의 루프에 집중해야합니다.

+0

방금 ​​형식 안전 비교가 1 백만 개를 시도했습니다. 0.2 초. 프로파일 러 (예를 들어 xdebug)를 사용하여 * 실제 * 병목 현상이있는 곳을 찾으십시오. – Wim

+0

@Wim, xdebug는 라인별로 성능 결과를 제공하지 않고 기능별로 작동합니다. 여기서 쓸모가 없을 것입니다. – vava

+0

@vava 전적으로 쓸모가 없습니다. 함수를 여러 함수 (각 줄마다 하나씩, 궁극적으로는 그 함수를 찾기 위해 멀리 갈 필요가 없습니다)로 나눌 수 있습니다. 조금 귀찮은, 나도 알아,하지만 보통 가치있는 접근. – Wim