우선, 응용 프로그램의 90 %에서 성능 차이가 전혀 관련이 없지만, 어느 것이 더 빠른 구성인지 알아야합니다. 그리고 ...
현재 인터넷에서 이용할 수있는 정보는 혼란 스럽습니다. 많은 사람들이 foreach가 나쁘다고 말하지만 기술적으로 반복자를 사용하여 배열 순회 작성을 단순화한다고 가정하기 때문에 더 빠릅니다. 반복자는 더 빠르다고 가정하지만 PHP에서는 분명히 죽었습니다 (또는 PHP가 아닙니까?). 배열 함수에 대해 이야기하고 있습니다 : next () prev () reset () 등. 심지어 함수이고 함수처럼 보이는 PHP 언어 기능 중 하나가 아닌 경우에도 마찬가지입니다.
이것을 조금 좁히려면 : 1보다 큰 단계로 배열을 순회하는 것은 흥미롭지 않습니다 (음수 단계, 즉 역 반복). 또한 임의의 점을 왕복하는 것에 관심이 없으며 0에서 길이까지입니다. 또한 1000 개가 넘는 키로 정기적으로 배열을 조작하는 것을 보지 못하지만 응용 프로그램의 논리에서 배열이 여러 번 통과하는 것을 볼 수 있습니다! 또한 조작의 경우 주로 문자열 조작 및 에코 만 수행합니다.
참고 사이트는 다음과 같습니다.
http://www.phpbench.com/
http://www.php.lt/benchmark/phpbench.php
내가 어디서나 듣는 것 :
foreach
느리고 따라서for
/while
빠릅니다- PHP
foreach
는 반복되는 배열을 복사합니다. 더 빨리 만들려면 참조를 사용해야합니다. - 이 같은 코드 : 보다 빠릅니다
$key = array_keys($aHash); $size = sizeOf($key);
for ($i=0; $i < $size; $i++)foreach
여기 내 문제가 있습니다. 이 테스트 스크립트를 작성했습니다 : http://pastebin.com/1ZgK07US 스크립트를 몇 번이나 실행하더라도 다음과 같은 결과가 나타납니다.
foreach 1.1438131332397
foreach (using reference) 1.2919359207153
for 1.4262869358063
foreach (hash table) 1.5696921348572
for (hash table) 2.4778981208801
한마디로 :
foreach
foreach
참조 보다 빠릅니다foreach
보다 빠르다for
foreach
for
해시 테이블 보다 빠릅니다.
누군가 설명 할 수 있습니까?
- 내가 뭔가 잘못하고 있습니까?
- PHP foreach 참조가 실제로 차이를 일으키고 있습니까? 참조로 전달하면 왜 복사하지 않습니까?
- foreach 문에 해당하는 반복자 코드는 무엇입니까? 나는 인터넷에서 몇 가지를 보았지만 테스트 할 때마다 타이밍이 벗어났습니다. 또한 몇 가지 간단한 반복자 구문을 테스트했지만 괜찮은 결과를 얻지 못하는 것 같습니다. PHP의 배열 반복자는 끔찍한가요?
- FOR / FOREACH (및 WHILE) 이외의 배열을 반복하는 더 빠른 방법 / 방법 / 구성이 있습니까?
PHP 버전 5.3.0
편집 : 답변 여기 사람들의 도움으로 모든 질문에 대한 답변을 함께 작성할 수있었습니다. 여기에 요약하겠습니다 :
- "내가 뭔가 잘못하고 있니?" 합의는 다음과 같습니다 : 예, 벤치 마크에서 에코를 사용할 수 없습니다. 개인적으로, 나는 여전히 임의의 실행 시간을 가진 echo가 어떤 함수인지, 다른 함수가 어떻게 다른지 전혀 알지 못합니다-그 스크립트가 모든 것보다 foreach의 정확한 동일한 결과를 더 잘 생성하는 능력 그냥 "당신은 echo를 사용하고 있습니다"라고 설명합니다. 그러나 테스트가 더 나은 것으로 이루어져야한다고 생각합니다. 이상적인 타협은 생각 나지 않습니다.
- "PHP foreach 참조가 실제로 차이를 만들어 내고 있습니까? 참조로 전달하면 왜 복사하지 않습니까?" ircmaxell은 그렇습니다. 추가 테스트를 통해 대부분의 경우 참조가 더 빨라야한다는 것을 알 수 있습니다. 위의 코드 조각을 감안할 때 가장 의미있는 것은 아닙니다. 나는이 문제가 그러한 수준에서 귀찮게하기에는 너무 직관적이지 않을 수 있으며 실제로 각 상황에 어떤 것이 더 좋은지를 결정하기 위해 디 컴파일과 같은 극단적 인 것이 필요하다는 것을 인정합니다.
- "foreach 문의 동등한 반복자 코드는 무엇입니까? 인터넷에서 몇 가지를 보았지만 테스트 할 때마다 타이밍이 나갔습니다. 또한 간단한 반복자 구성도 테스트했지만 괜찮은 결과를 얻지 못한 것 같습니다. -PHP에서 배열 반복자가 끔찍합니까? " ircmaxell은 다음과 같이 대답했습니다. 코드는 PHP 버전> = 5에만 유효 할 수 있지만
- "FOR / FOREACH (및 WHILE) 이외의 배열을 반복하는 더 빠른 방법 / 방법 / 구성이 있습니까?" 고든에게 대답 해 주셔서 감사합니다. PHP5에서 새로운 데이터 유형을 사용하면 성능이 향상되거나 메모리가 향상됩니다 (상황에 따라 바람직 할 수 있음). 속도가 현명한 많은 새로운 유형의 배열이 array ()보다 낫지는 않지만 splpriorityqueue 및 splobjectstorage는 실질적으로 더 빠른 것 같습니다. Gordon이 제공 한 링크 : http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/
도와 주셔서 감사합니다.
간단한 순회에 대해 foreach (비 참조 버전)를 고수 할 것입니다.