strstr과 strpos 중 어떤 방법이 선호됩니까?

많은 개발자들이 서브스트링의 존재를 확인하기 위해 str과 strpos를 모두 사용하고 있는 것을 알 수 있었습니다.그 중 하나가 선호되고 그 이유는 무엇입니까?



질문에 대한 답변



PHP 온라인 매뉴얼:

건초더미 내에서 특정 니들이 발생하는지 여부만 판별하는 경우에는 보다 빠르고 메모리 사용량이 적은 기능을 사용하십시오.




다음은 질문에 대한 다른 답변(+benchmarks)입니다. 이 답변은 거의 동일합니다(질문할 때 귀하의 답변을 알지 못했습니다).


그 사이에, 벤치마크 테스트도 작성했습니다만, 각 관련 기능에 대해 1000000회 실행했습니다(strstr(),strpos(),stristr()그리고.stripos()).
코드는 다음과 같습니다.

<?php
function getmicrotime() {
list($usec, $sec) = explode(" ", microtime());
return ((float) $usec + (float) $sec); }
$mystring = 'blahblahblah';
$findme = 'bla';
echo 'strstr & strpos TEST:<pre>'; $time_start = getmicrotime(); for($i=0; $i<1000000; $i++) strstr($mystring, $findme); $time_needed_strstr = getmicrotime() - $time_start; echo 'strstr():
',
round( $time_needed_strstr , 8 ). PHP_EOL;
$time_start = getmicrotime(); for($i=0; $i<1000000; $i++) stristr($mystring, $findme); $time_needed_stristr = getmicrotime() - $time_start; echo 'stristr():
',
round( $time_needed_stristr , 8 ) . PHP_EOL;
$time_start = getmicrotime(); for($i=0; $i<1000000; $i++) strpos($mystring, $findme) !== false; $time_needed_strpos = getmicrotime() - $time_start; echo 'strpos() !== false:
',
round( $time_needed_strpos , 8 ) . PHP_EOL;
$time_start = getmicrotime(); for($i=0; $i<1000000; $i++) stripos($mystring, $findme) !== false; $time_needed_stripos = getmicrotime() - $time_start; echo 'stripos() !== false: ',
round( $time_needed_stripos , 8 ) . PHP_EOL;
echo PHP_EOL;
echo 'time_needed_stristr - time_needed_strstr: ',
round( $time_needed_stristr - $time_needed_strstr , 8) . PHP_EOL; echo 'time_needed_stripos - time_needed_strpos: ',
round( $time_needed_stripos - $time_needed_strpos , 8) . PHP_EOL;
echo PHP_EOL;
echo 'time_needed_strstr
- time_needed_strpos:
',
round( $time_needed_strstr - $time_needed_strpos , 8) . PHP_EOL; echo 'time_needed_stristr - time_needed_stripos: ',
round( $time_needed_stristr - $time_needed_stripos , 8) . PHP_EOL;
echo '</pre>';
?> 

첫 번째 출력은 다음과 같습니다.이 출력은 승자를 나타내고 있습니다.

strstr & strpos TEST: strstr():
2.39144707 stristr():
3.65685797 strpos() !== false:
2.39055395 stripos() !== false: 3.54681897
time_needed_stristr - time_needed_strstr: 1.2654109 time_needed_stripos - time_needed_strpos: 1.15626502
time_needed_strstr
- time_needed_strpos:
0.00089312 time_needed_stristr - time_needed_stripos: 0.110039

다음 출력은 첫 번째 출력과 비슷합니다(strpos()다시 승자) :

strstr & strpos TEST: strstr():
2.39969015 stristr():
3.60772395 strpos() !== false:
2.38610101 stripos() !== false: 3.34951186
time_needed_stristr - time_needed_strstr: 1.2080338 time_needed_stripos - time_needed_strpos: 0.96341085
time_needed_strstr
- time_needed_strpos:
0.01358914 time_needed_stristr - time_needed_stripos: 0.25821209 

아래가 또 하나 있는데, 더 흥미로운 것은 이 경우,strstr()승자는 다음과 같습니다.

strstr & strpos TEST: strstr():
2.35499191 stristr():
3.60589004 strpos() !== false:
2.37646604 stripos() !== false: 3.51773095
time_needed_stristr - time_needed_strstr: 1.25089812 time_needed_stripos - time_needed_strpos: 1.14126492
time_needed_strstr
- time_needed_strpos:
-0.02147412 time_needed_stristr - time_needed_stripos: 0.08815908 

즉, 실제로는 ‘환경적 상황에 의존할 수 있으며, 때로는 영향을 미치기 어려울 수 있으며, 이와 같이 ‘마이크로 최적화 태스크’의 결과를 변경할 수 있습니다.또한 문자열이 다른 문자열에 존재하는지 여부를 확인할 수 있습니다.

하지만 저는 대부분의 경우,생각에, 제 생각에는,strstr().

나는 이 시험이 누군가에게 도움이 되었기를 바란다.




많은 개발자들 마이크로 최적화 목적으로 strpos을 사용한다.

를 사용하면 부울 컨텍스트에서 결과 문자열을 false로 해석할 수 없는 경우에만 사용할 수 있습니다.

이벤트에 의해 극복: PHP8은 “작업에 적합한 도구”를 도입했습니다(이전 셋업에서는 심을 사용할 수 있습니다).통역사 수준의 비교와 통사적 오버헤드 없이 모든 사람들이 좋아했던 바로 그 일을 할 수 있습니다.




strpos()는 건초 더미 내의 특정 바늘 위치를 검출합니다.stristr()은 바늘이 건초 더미에 있는지 여부를 테스트합니다.

strpos()는 고속으로 메모리 소비량이 적습니다.

strstr()의 이유: 바늘이 문자열의 선두에 있으면 strpos가 0을 반환합니다(따라서 === false로 확인해야 함).




가독성과 쉬운 코딩이 좋습니다.strpos() !==false 좀 헷갈리네요.