PHP 최적화를위한 루프 불변 코드 모션 이해
Zend 엔진이 루프 불변 표현식을 자동으로 최적화하지 않기 때문에 LOOP-Invariant Code Motion (LICM)을 PHP에 수동으로 적용해야합니다. 1. 반복 통화를 피하기 위해 루프 전에 Cache count () 결과. 2. 루프 내에서 조건부 블록 외부에서 getUserEmail ($ user)과 같은 불변 함수 호출을 이동하거나 결과를 캐시합니다. 3. 액세스 오버 헤드를 줄이기 위해 $ this-> config [ 'threshold']와 같은 캐시 개체 또는 배열 속성 조회. 작업이 저렴한 경우 LICM을 피하거나 루프가 실행되지 않거나 가독성이 크게 영향을받습니다. JIT 통신 언어와 달리 PHP는 개발자에게 의존하여 특히 대규모 데이터 세트 또는 트래픽 응용 프로그램을 통해 더 나은 성능을 위해 루프를 수동으로 최적화합니다.
LICM (Loop-Invariant Code Motion)은 반복에 걸쳐 변경되지 않을 때 루프에서 계산을 움직여 성능을 향상시키는 컴파일러 최적화 기술입니다. PHP는 해석 된 언어이며 컴파일링 된 언어 (예 : C 또는 Java)와 같은 저수준 최적화를 수행하지 않지만 LICM을 이해하면 PHP 개발자가 수동으로보다 효율적인 코드를 작성하는 데 도움이됩니다.

루프 불신 코드 란 무엇입니까?
루프 내부의 코드 조각은 모든 반복에서 결과가 동일하게 유지되면 변하지 않습니다 . 여기에는 일반적으로 다음이 포함됩니다.
- 상수 매개 변수가있는 함수 호출
- 루프 내부에서 변경되지 않는 변수를 기반으로 한 계산
- 변경되지 않은 객체의 객체 속성 조회
- 변형되지 않은 배열의 어레이 크기 확인
예를 들어:

for ($ i = 0; $ i <count ($ array); $ i) { echo $ array [$ i]; }
여기에서 $array
루프 내부에서 수정되지 않으면 count($array)
는 루프 별 변형입니다. 그러나 최적화되지 않는 한 모든 반복마다 재 계산됩니다.
PHP에 수동 LICM이 필요한 이유
PHP의 Zend 엔진은 일부 최적화를 수행하지만 (특히 Opcache가 활성화되어 있음) 보수적입니다. 일반적으로 기능 통화 또는 복잡한 표현식을 루프에서 자동으로 이동하지 않습니다. 즉, 이러한 사례를 최적화하기 위해 개발자에게 부담이 떨어집니다.

수동 최적화가 없으면 중복 작업이 축적됩니다.
- CPU 사용량 증가
- 느린 스크립트 실행
- 반복적 인 평가로 인한 메모리 소비가 높아집니다
PHP에서 LICM을 적용하는 방법
루프 불신 코드 모션을 수동으로 적용하려면 루프가 시작되기 전에 불변 표현식을 추출하십시오.
1. Cache count()
결과
// bad : count ()는 모든 반복을 호출합니다 for ($ i = 0; $ i <count ($ array); $ i) { // ... } // 양호 : count ()가 밖으로 이동했습니다 $ len = count ($ array); for ($ i = 0; $ i <$ len; $ i) { // ... }
이것은 PHP 루프에서 가장 일반적이고 영향력있는 최적화 중 하나입니다.
2. 기능 호출을 외부로 이동합니다
// 나쁜 : 반복적으로 부르는 함수 foreach ($ user as $ user) { if (getUserType ($ user) === 'admin') { sendalert (getUserEmail ($ user)); // getUserEmail은 변하지 않을 수 있습니다 } } // 더 나은 : 불변의 호출을 추출합니다 foreach ($ user as $ user) { if (getUserType ($ user) === 'admin') { $ email = getUserEmail ($ user); // 여전히 안에 있지만 관리자만을위한 것입니다 sendalert ($ 이메일); } }
getUserEmail($user)
이 $user
에만 의존하고 $user
변경되지 않으면 해당 루프 반복 내에서 변하지 않지만 루프 외부에서 완전히 이동할 수는 없습니다. 그럼에도 불구하고 반복 당 여러 번 부르지 마십시오.
3. 캐시 개체 또는 배열 속성
클래스 프로세서 { private $ config = [ 'threshold'=> 100]; 공개 기능 실행 ($ data) { // 불량 : 루프 내부 조건의 속성 액세스 for ($ i = 0; $ i <count ($ data); $ i) { if ($ data [$ i]> $ this-> config [ 'threshold']) { // ... } } // 양호 : 값을 캐시하십시오 $ threshold = $ this-> config [ 'threshold']; $ len = count ($ data); for ($ i = 0; $ i <$ len; $ i) { if ($ data [$ i]> $ threshold) { // ... } } } }
속성이나 배열 조회조차 비용이 적습니다. 그들을 캐싱하는 것은 특히 깊은 루프에서 도움이됩니다.
LICM을 신청하지 않을 때
모든 표현이 움직여서는 안됩니다. 다음과 같은 경우 조기 최적화를 피하십시오.
- 기능 호출은 이미 저렴합니다 (예 : 로컬 가변 액세스)
- 루프 본체는 표현식에 사용 된 변수를 수정합니다
- 루프는 전혀 실행되지 않을 수 있습니다 (그러나 캐싱은 여전히 무시할만한 비용이 있습니다)
- 가독성은 크게 고통받습니다
또한 PHP의 foreach
루프는 일반적으로 배열이 사전 가져 오기 때문에 count()
문제로 어려움을 겪지 않지만 조건에서 count()
가있는 루프 for
.
최종 생각
PHP는 JIT 컴파일 언어와 같이 루프 불변 코드를 자동으로 최적화하지 않습니다. Opcache는 바이트 코드 컴파일을 캐싱하여 실행 속도를 향상 시키지만 논리를 재구성하지는 않습니다. 즉, 효율적인 PHP를 작성하는 데 종종 LICM과 같은 클래식 컴파일러 최적화를 적용하는 것이 포함됩니다.
키는 고리 내부에서 비싸고 반복되는 작업을 식별하고 안전 할 때 옮기는 것입니다. 대규모 데이터 세트 나 교통량이 많은 응용 프로그램에서 눈에 띄는 성능을 얻을 수있는 작은 변화입니다.
기본적으로 : 루프가 변경되지 않으면 전에 한 번 계산하십시오.
위 내용은 PHP 최적화를위한 루프 불변 코드 모션 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undress AI Tool
무료로 이미지를 벗다

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

참조로 배열을 통과 할 때는 예상치 못한 수정을 피하기 위해 루프 직후에 참조 변수를 파괴해야합니다. 1. 루프 후, 참조는 원래 배열의 마지막 요소를 가리키며 후속 할당은 실수로 배열을 변경합니다. 해결책은 unset ($ value)를 사용하는 것입니다. 2. 중첩 루프에서 동일한 기준 변수를 반복하면 경고 또는 예측할 수없는 동작이 발생하며 각 루프 후에는 설정이 없어야합니다. 3. Traversal 동안 배열 구조 (예 : Unset 요소)를 수정하면 예측할 수없는 반복 동작이 발생하며 대신 루프를 피하거나 사용해야합니다. 대안에는 Array_Map 사용 또는 키 이름을 통해 배열 수정이 포함되며, 이는 더 안전하고 명확합니다. 요컨대, 참조 트래버스를 사용하여 조심해야하며, 각 사용 후에 안전을 보장하기 위해 설정을 해제하지 않아야합니다.

루프-비 변형 코드 촬영 (LICM) MUSTBEPLIEDENCLESTEMALLESLESTENCLESTENCHAUTMIZELOP-invariantexpressions.1.cachecount () resultSeLoopToAvoidRepeatedCalls.2

Array_Map 및 Array_Reduce를 사용하여 Overused foreach를 교체하여 PHP 코드를 더 간단하고 읽기 쉽고 테스트하기 쉽게 만듭니다. 1. 루프 대신 array_map을 사용하여 데이터를 변환하고, 배열 및 변동성 상태를 수동으로 관리하지 않으며, 의도를 명확하게 만드십시오. 2. array_reduce를 사용하여 배열을 단일 값 또는 구조로 집계하고 초기 값 및 축적기를 통해 외부 변수 및 부작용을 피하십시오. 3. Array_Map, Array_Filter 및 Array_ReDuce를 사용하여 읽은 데이터 처리 파이프 라인을 구축하여 구성 및 표현을 개선하십시오. 4. Array_Ray_Map의 고급 특성을 이해하기 위해 항상 Array_ReDuce의 초기 값을 제공하는 데주의를 기울입니다.

요소의 삭제 또는 삽입이 인덱스 구조를 변경하는 반면 루프 변수 또는 반복자는 동시에 업데이트되지 않으므로 요소 또는 예외를 건너 뜁니다. 예를 들어, JavaScript에서 앞쪽에서 뒤로 이동할 때 요소를 삭제하면 후속 요소가 앞으로 이동하지만 인덱스가 증가하면 다음 요소가 건너 뜁니다. Python에서 목록을 직접 수정하면 RuntimeError 또는 행동 예외가 발생할 수 있습니다. 이 문제를 피하는 방법은 다음과 같습니다. 1. 역전기, 삭제 요소는 처리되지 않은 저 지질 항목에 영향을 미치지 않습니다. 2. 먼저 수정할 인덱스 또는 요소를 수집 한 다음 반복 후 균일하게 처리하면 삭제에 역 순서 작동이 필요합니다. 3. 필터 및 맵과 같은 기능적 방법을 사용하여 원래 배열의 돌연변이를 피하기 위해 새로운 배열을 생성합니다. 또한 앞으로주의를 기울입니다

PHP는 Foreach Loops의 어레이 해체를 지원합니다. 1. [$ x, $ y]와 같은 인덱스 서브 어레이를 직접 해체하여 좌표를 추출 할 수 있습니다. 2. [ 'key'=> $ var] 구문 해체 연관 배열을 지원합니다. 3. $ var = 기본값을 통해 결 측값에 대한 기본값을 제공 할 수 있습니다. 4. $ key => [$ a, $ b]와 같은 캡처하기 위해 키 이름을 결합하여 중첩 된 구조를 처리하여 코드를보다 간결하고 안전하며 읽기 쉽습니다.

NaivelyAwaitingInsideLoopSinasyncphpcausessequestiacentiactecution, 2.inamp, useamp \ promise \ all () torunalLoperationsInparallelandwaitforCompletion, oramp \ iterator \ fromiterable () toprocessrestesteyarrive;

중첩 논리를 독립적 인 기능으로 추출하여 복잡성을 줄이고 가독성을 향상시킵니다. 2. 코드를 간결하게 만들기 위해 적용 가능한 경우 목록 이해 또는 생성기 표현식을 사용하십시오. 3. 중첩을 줄이기 위해 반복 도구 또는 데이터 전처리를 통해 데이터 구조를 평평하게합니다. 4. IterTools와 같은 내장 라이브러리 기능을 사용하여 루프 구조를 최적화합니다. 5. 반복적 인 논리를 캡슐화하기 위해 객체 지향 또는 기능적 프로그래밍 모드를 고려하십시오. 궁극적 인 목표는 명확한 추상화 및 이름 지정을 통해 코드 의도를 명확하게하는 것입니다. 깊은 둥지로 인한 어려움을 이해하여 유지 관리 및 가독성을 향상시키는 것입니다.

PHP 사용자 정의 객체를 반복 할 수 있도록 ITERATORAGGREGATE 또는 ITERATOR 인터페이스를 선택할 수 있습니다. 1. iteratorAggregate를 사용하는 경우 getIterator () 메소드 만 구현하고 기존 컬렉션을 단순히 포장하는 데 적합한 통과 가능한 객체를 반환하면됩니다. 2. ITERATOR를 사용할 때는 반복 프로세스를 잘 제어 해야하는 시나리오에 적합한 되감기, 현재, 키, 다음 및 유효한 5 가지 방법을 구현해야합니다. 복잡한 반복 논리가 필요한지 여부에 따라 적절한 방법을 선택해야하며, 둘 다 객체를 Foreach에 사용할 수 있도록합니다.
