哪种方法是首选的strstr或strpos?

我注意到很多开发人员正在使用strstr和strpos来检查子string的存在。 他们中的一个是首选的,为什么?

从PHP 在线手册 :

如果您只想确定干草堆内是否出现特定针,请使用速度更快,占用内存更less的函数strpos()。

这里有一些其他答案(+基准)我得到了我的问题,这几乎是相同的(我没有意识到你的问)。


同时我也做了我自己的基准testing,我为每个相关函数( strstr()strpos()stristr()stripos() )跑了1000000次。
代码如下:

 <?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 

这意味着它可以真正依赖于有时难以影响的“环境条件” ,并且可以改变这样的“微观优化任务”的结果,以防你只是检查另一个string是否存在。

但是我认为在大多数情况下, strpos()strstr()相比是赢家

我希望这个testing对某人有用。

许多开发人员使用strpos进行微观优化

如果在布尔上下文中不能将结果string解释为false,则只能使用strstr

strpos()检测特定针所在的干草堆的位置。 stristr()testing针是否在干草堆中的任何地方

因此strpos()更快,内存消耗更less

strstr()的一个原因:如果你的针在string的开头,strpos返回0(所以必须用=== false来检查它)

我更喜欢strstr()的可读性和简单的编码strpos() !==falsestrpos() !==false困惑。