PHP에서 성능 최적화는 항상 개발자의 초점이되었습니다. 특히 많은 양의 데이터를 처리 할 때 올바른 데이터 처리 방법을 선택하는 것이 특히 중요합니다. Array_change_key_case () 및 Foreach Traversal은 일반적으로 PHP에서 사용되는 배열 작동 방법이며 다른 시나리오에서 다른 성능 차이를 보여줄 수 있습니다. 그렇다면이 둘 사이의 효율 차이를 평가하는 방법은 무엇입니까? 이 기사에서는 SPL_object_id ()를 사용하여 두 가지 효율성을 분석하는 방법에 대해 논의 할 것입니다.
Array_change_key_case ()는 배열의 모든 키 이름을 대문자 또는 소문자로 변환하는 PHP의 내장 기능입니다. 이 기능은 두 가지 매개 변수를 수용합니다.
<span><span><span class="hljs-title function_ invoke__">array_change_key_case</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$array</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$case</span></span><span> = CASE_LOWER): </span><span><span class="hljs-keyword">array</span></span><span>
</span></span>
$ 배열 : 변환 할 키 이름 배열.
$ CASE : 변환 방법을 지정합니다. Case_Lower는 키 이름을 소문자로 변환하고 Case_Upper는 키 이름을 대문자로 변환합니다.
이 함수는 새 배열을 반환하고 원래 배열은 수정되지 않습니다.
Foreach는 PHP에서 일반적으로 사용되는 배열 트래버스 구조입니다. 포인터 순서로 배열의 각 요소를 가로 지릅니다. 기본 사용량은 다음과 같습니다.
<span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$array</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> => </span><span><span class="hljs-variable">$value</span></span><span>) {
</span><span><span class="hljs-comment">// 배열 요소에서 작동합니다</span></span><span>
}
</span></span>
Foreach 는 PHP에서 가장 성능있는 배열 트래버스 방법 중 하나이며 종종 많은 양의 데이터를 처리하는 데 사용됩니다.
Array_change_key_case () 와 Foreach Traversal의 성능 차이를 비교하려면 SPL_OBJECT_ID ()를 사용하여 두 가지 메모리의 작업을 관찰 할 수 있습니다. php에서 spl_object_id ()는 객체의 고유 식별자를 반환하는 데 사용됩니다. 작업 전후에 객체 ID를 비교하여 메모리 변경을 추정하여 효율성을 평가할 수 있습니다.
Array_change_key_case () 및 Foreach는 배열을 처리 할 때 배열 객체에서 작동합니다. 특히 배열이 클 경우 더 많은 메모리 할당 및 복사 작업이 포함될 수 있습니다. 이 두 가지 방법의 효율성을 평가하기 위해 실행 전후에 SPL_OBJECT_ID ()를 사용하여 객체의 변경 사항을 확인할 수 있습니다.
샘플 코드는 다음과 같습니다.
<span><span><span class="hljs-comment">// 테스트 데이터</span></span><span>
</span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-string">'One'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'Two'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'Three'</span></span><span> => </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">'Four'</span></span><span> => </span><span><span class="hljs-number">4</span></span><span>];
</span><span><span class="hljs-comment">// 사용 spl_object_id() 작업 전에 배열 객체를 확인하십시오 ID</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Before array_change_key_case() ID: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">spl_object_id</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>) . PHP_EOL;
</span><span><span class="hljs-variable">$newArray</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_change_key_case</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>, CASE_LOWER);
</span><span><span class="hljs-comment">// 사용 spl_object_id() 작동 후 배열 객체를 확인하십시오 ID</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"After array_change_key_case() ID: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">spl_object_id</span></span><span>(</span><span><span class="hljs-variable">$newArray</span></span><span>) . PHP_EOL;
</span><span><span class="hljs-keyword">echo</span></span><span> PHP_EOL;
</span><span><span class="hljs-comment">// 사용 foreach 배열을 통해 반복하십시오</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Before foreach() ID: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">spl_object_id</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>) . PHP_EOL;
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$array</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> => </span><span><span class="hljs-variable">$value</span></span><span>) {
</span><span><span class="hljs-comment">// 트래버스 작동</span></span><span>
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"After foreach() ID: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">spl_object_id</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>) . PHP_EOL;
</span></span>
위의 코드에서 볼 수 있듯이 Array_change_key_case ()는 원래 배열 객체를 수정하는 대신 새 배열 객체를 생성 할 수 있으므로 SPL_Object_id ()는 작동 전과 후에 다릅니다. 이것은 Array_change_key_case ()가 원래 배열을 복사하여 추가 메모리 오버 헤드를 나타냅니다.
비교적 말하면, Foreach Traversal은 배열의 각 요소에서 작동하며 새 배열 객체를 생성하지 않으므로 객체 ID는 일반적으로 변경되지 않으며 작은 메모리 오버 헤드가 있습니다.
둘 다의 효율성을보다 포괄적으로 평가하기 위해, 마이크로 타임 (True)을 사용하여 실행 시간을 측정 할 수 있습니다. 간단한 성능 비교 예는 다음과 같습니다.
<span><span><span class="hljs-comment">// 테스트 데이터</span></span><span>
</span><span><span class="hljs-variable">$array</span></span><span> = </span><span><span class="hljs-title function_ invoke__">range</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">100000</span></span><span>);
</span><span><span class="hljs-comment">// 측정 array_change_key_case() 성능</span></span><span>
</span><span><span class="hljs-variable">$start</span></span><span> = </span><span><span class="hljs-title function_ invoke__">microtime</span></span><span>(</span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-variable">$newArray</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_change_key_case</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>, CASE_UPPER);
</span><span><span class="hljs-variable">$end</span></span><span> = </span><span><span class="hljs-title function_ invoke__">microtime</span></span><span>(</span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"array_change_key_case() 실행 시간: "</span></span><span> . (</span><span><span class="hljs-variable">$end</span></span><span> - </span><span><span class="hljs-variable">$start</span></span><span>) . </span><span><span class="hljs-string">" 두번째"</span></span><span> . PHP_EOL;
</span><span><span class="hljs-comment">// 측정 foreach 遍历성능</span></span><span>
</span><span><span class="hljs-variable">$start</span></span><span> = </span><span><span class="hljs-title function_ invoke__">microtime</span></span><span>(</span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$array</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> => </span><span><span class="hljs-variable">$value</span></span><span>) {
</span><span><span class="hljs-comment">// 트래버스 작동</span></span><span>
}
</span><span><span class="hljs-variable">$end</span></span><span> = </span><span><span class="hljs-title function_ invoke__">microtime</span></span><span>(</span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"foreach() 실행 시간: "</span></span><span> . (</span><span><span class="hljs-variable">$end</span></span><span> - </span><span><span class="hljs-variable">$start</span></span><span>) . </span><span><span class="hljs-string">" 두번째"</span></span><span> . PHP_EOL;
</span></span>
spl_object_id () 에 의해 메모리 변경을 관찰하고 실행 시간 테스트를 결합함으로써 다음과 같은 결론을 도출 할 수 있습니다.
Array_change_key_case () 는 새로운 배열을 생성하여 특히 빅 데이터를 처리 할 때 성능이 어느 정도 영향을받습니다.
Foreach Traversal은 배열의 모든 요소에서 작동하며 새 배열 객체를 생성하지 않으며 메모리가 작은 오버 헤드를 가지며 일반적으로 실행하기가 더 빠릅니다.
따라서 Foreach는 빅 데이터를 처리 할 때 Array_change_key_case () 보다 더 효율적입니다. 배열 키 이름의 경우를 변경 해야하는 경우 고성능 요구 사항이있는 시나리오에서 Array_change_key_case ()를 사용하지 않는 것이 좋습니다.