많은 개발자가 strstr과 strpos를 모두 사용하여 하위 문자열의 존재를 확인하고 있음을 알았습니다. 그들 중 하나가 선호되며 그 이유는 무엇입니까?
답변:
if(strpos($haystack,$needle) !== false) { // do something }
, 절대로 사용 하지 않습니다 if(strpos($haystack,$needle)) { // do bad things }
. 이가의 맨 처음에 strpos
있으면 0을 반환 하고 0은 거짓으로 간주됩니다. 참으로 평가됩니다. 거짓으로 평가됩니다. $needle
$haystack
(0 == false)
(0 === false)
여기 에 몇 가지 다른 답변 (+ 벤치 마크)이 있습니다. 제 질문에 대해 거의 똑같습니다 (질문 할 때 귀하의 답변을 몰랐습니다).
그 동안 나는 또한 내가 각 관련 기능에 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>';
?>
그리고 strpos()
이것이 승자 임을 보여주는 첫 번째 출력입니다 .
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
이것은 실제로 영향을 미치기 어려운 "환경 적 상황"에 의존 할 수 있으며 문자열이 다른 문자열에 존재하는지 여부를 확인하는 경우 이와 같이 "마이크로 최적화 작업"의 결과를 변경할 수 있음을 의미합니다.
그러나 나는 대부분의 경우strpos()
에 비해 승자 라고 생각 합니다 strstr()
.
이 테스트가 누군가에게 도움이 되었기를 바랍니다.
많은 개발자 strpos
가 마이크로 최적화 목적으로 사용 합니다.
사용 strstr
은 결과 문자열이 부울 컨텍스트에서 false로 해석 될 수없는 경우에만 작동합니다.
strpos()
. 해당 위치 뒤에 하위 문자열을 원하면 strstr()
.
strstr
수행 하기 때문에 속도가 느립니다.
strpos ()는 건초 더미에서 특정 바늘이있는 위치를 감지합니다. stristr ()은 바늘이 건초 더미의 어디에 있는지 테스트합니다.
따라서 strpos ()는 더 빠르고 메모리 소모가 적습니다.
strstr ()의 이유 : 바늘이 문자열의 시작 부분에 있으면 strpos는 0을 반환합니다 (따라서 === false로 확인해야합니다).
strstr()
바늘 앞뒤의 모든 것을 반환하므로 먼저 strpos()
해당 부분 문자열을 생성해야 합니다. 그것이 성능 저하가있는 곳입니다.
나는 strstr()
가독성과 쉬운 코딩을 선호한다 .. strpos() !==false
약간 혼란스러워 ..
strstr
너무 비슷한입니다strtr
strstr
엄격한 비교가 필요합니다. 예 :('123450', '0')