Php 哪种方法是首选的strstr或STRPO?
我注意到许多开发人员同时使用strstr和strpos来检查子字符串的存在。其中一个是首选的吗?为什么?来自PHP: 如果您只想确定 特定的针出现在 干草堆,用得更快,用得更少 记忆密集型功能 相反 strpos()检测大海捞针的位置。stristr()测试针是否在草堆中的任何位置 因此,strpos()更快,占用内存更少Php 哪种方法是首选的strstr或STRPO?,php,strpos,strstr,Php,Strpos,Strstr,我注意到许多开发人员同时使用strstr和strpos来检查子字符串的存在。其中一个是首选的吗?为什么?来自PHP: 如果您只想确定 特定的针出现在 干草堆,用得更快,用得更少 记忆密集型功能 相反 strpos()检测大海捞针的位置。stristr()测试针是否在草堆中的任何位置 因此,strpos()更快,占用内存更少 strstr()的原因:如果指针位于字符串的开头,strpos返回0(因此必须使用===false进行检查)许多开发人员使用strpos进行微优化 只有当生成的字符串不能在布
strstr()的原因:如果指针位于字符串的开头,strpos返回0(因此必须使用===false进行检查)许多开发人员使用
strpos
进行微优化
只有当生成的字符串不能在布尔上下文中解释为false时,使用strstr才能起作用。是我对我的问题的一些其他答案(+基准),这几乎是相同的(我问的时候没有意识到你的答案)。
与此同时,我还做了自己的基准测试,我对每个相关函数(
strstrstr()
,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()
与strstr()
相比是赢家
我希望这个测试对某些人有用。我更喜欢
strstr()
的可读性和易于编码strpos()==false(错误)
有点让人困惑。您提到的基准是与substr(而不是strstr)相对的,这是一个完全虚假的解释-strstrstr()
返回指针之前或之后的所有内容,因此它首先必须执行与strps()
等效的操作,然后创建子字符串。这就是性能受到影响的地方。这不是微观优化,而是为工作使用正确的功能。如果我想要字符串的位置,我调用strpos()
。如果我想在那个位置之后使用子字符串,我会调用strstr()
@Alnitak:我刚才说的。如果您想检查字符串的存在,那么有一个函数用于检查。如果你真的需要这个职位,那么还有另外一个当你在没有实际需要职位的情况下寻找职位时,那很难“为工作使用正确的功能”。其目的显然是优化微秒距离。(这不是你引用的吗?@mario但是没有一个函数的唯一目的是检查子字符串是否存在。一旦您实际找到子字符串(如果找到),子字符串的位置就是自由信息。OTOH,strstr
做的比要求的多,这就是为什么它慢的原因。@Alnitak:注意,不是新闻。您似乎非常坚持指出性能差异,而且仅此而已。这是微观优化的一个信号。它不会在分析器中产生一个光点。它真正起作用的地方在于代码的可读性。@mario实际上我只关心性能的一点点。我非常关心在工作中使用正确的功能;-)+1、您可以使用STRPO或stripos。不要忘记检查php文档中关于使用===FALSE的警告;详细说明费米奇的评论:我总是使用if(strpos($haystack,$needle)!==false){//do something}
,从不使用if(strpos($haystack,$needle)){//do bad things}
<如果$needle
位于$haystack
的最开头,则code>strpos将返回0,并且0被视为等于false<代码>(0==false)计算结果为true(0==false)
的计算结果为false。来自C的人可能会考虑使用strchr函数,但在PHP中它实际上是strstr的别名,因此strpos是一个更好的选择。虽然这个基准测试很有用,但它不测量内存消耗,也不考虑长字符串,比如kbytes或mbytes。哈@user133408长字符串和更大的字节字符串甚至需要更长的时间。strstr
与strtr
太相似了。strtr
也需要严格比较示例:('123450','0')
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
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 & 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