[php] strstr 또는 strpos가 선호되는 방법은 무엇입니까?

많은 개발자가 strstr과 strpos를 모두 사용하여 하위 문자열의 존재를 확인하고 있음을 알았습니다. 그들 중 하나가 선호되며 그 이유는 무엇입니까?



답변

PHP 온라인 매뉴얼에서 :

특정 바늘이 건초 더미 내에서 발생하는지 확인하려면 strpos()
대신 더 빠르고 메모리 집약적 인 함수를 사용하십시오.


답변

여기 에 몇 가지 다른 답변 (+ 벤치 마크)이 있습니다. 제 질문에 대해 거의 똑같습니다 (질문 할 때 귀하의 답변을 몰랐습니다).


그 동안 나는 또한 내가 각 관련 기능에 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 ()는 건초 더미에서 특정 바늘이있는 위치를 감지합니다. stristr ()은 바늘이 건초 더미의 어디에 있는지 테스트합니다.

따라서 strpos ()는 더 빠르고 메모리 소모가 적습니다.

strstr ()의 이유 : 바늘이 문자열의 시작 부분에 있으면 strpos는 0을 반환합니다 (따라서 === false로 확인해야합니다).


답변

나는 strstr()가독성과 쉬운 코딩을 선호한다 .. strpos() !==false 약간 혼란스러워 ..


답변