首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >顺序的strpos()比一个preg_match的函数更快?

顺序的strpos()比一个preg_match的函数更快?
EN

Stack Overflow用户
提问于 2010-01-19 12:53:32
回答 2查看 2.2K关注 0票数 4

我需要测试一个字符串“hello”、“I am”、“”是否存在于名为“”的较长字符串中,如果其中一个字符串存在,我的测试就结束了,而且我知道如果其中一个字符串已经存在,其他字符串都不会出现。

在这种情况下,我请求你帮助我找到最有效的方法来写这个搜索,

是这样的3倍?

代码语言:javascript
复制
if (strpos ($ohreally, 'hello')){return false;}  
   else if (strpos ($ohreally, 'i am')){return false;}  
   else if (strpos ($ohreally, 'dumb')){return false;}  
   else {return true;}

还是一个preg_match?

代码语言:javascript
复制
if (preg_match('hello'||'i am'||'dumb', $ohreally)) {return false}   
   else {return true};

我知道preg_match代码是错误的,如果有人能提供正确的版本,我会非常感激。

谢谢!

答案

请读一下cletus说的话,看看测试小组做了什么。我还做了一个镜像时间测试,对各种字符串,长和短。有了这些结果

如果,您知道字符串值发生的概率从最可能到最小。(我没有注意到在排序正则表达式本身,即在/hello|i am|dumb//i am|dumb|hello/之间排序时,有一个很大的不同。

另一方面,在顺序strpos中,概率决定了所有的差异。例如,如果“你好”发生在90%,“我”7%,“哑巴”3%。您希望组织代码,首先检查“hello”,并尽快退出该函数。

我的微时间测试显示了这一点。

对于在第一、第二和第三次strpos()执行时分别找到针的海草A、B和C,时间如下,

strpos:

A: 0.00450秒/1 strpos()

B: 0.00911秒/2 strpos()

C: 0.00833秒/3 strpos()

C: 0.01180秒// 4strpos()增加一个额外的

对于preg_match:

A: 0.01919秒/1 preg_match()

B: 0.02252秒/1 preg_match()

C: 0.01060秒/1 preg_match()

如数字所示,strpos在第4 4rth执行之前更快,因此我将使用它,因为我只有3,子刺需要检查:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-19 12:58:10

正确的语法是:

代码语言:javascript
复制
preg_match('/hello|i am|dumb/', $ohreally);

我对这两种方法都有很多怀疑,但如果strpos()方法的速度更快,取决于您正在搜索的字符串的数量,我也不会感到惊讶。随着搜索词的增加,strpos()的性能会下降。大王可能会这么快,但不会那么快。

显然,正则表达式更强大。例如,如果您想匹配“哑”一词,而不是“蠢蛋”,那么这很容易用以下方法完成:

代码语言:javascript
复制
preg_match('/\b(hello|i am|dumb)\b/', $ohreally);

这对strpos()来说要困难得多。

注:从技术上讲,是一个零宽度的单词边界.“零宽度”意味着它不消耗输入字符串的任何部分,单词边界意味着它匹配字符串的开头、字符串的结尾、从单词(数字、字母或下划线)字符到非单词字符的转换或从非单词字符到单词字符的转换。非常有用。

编辑:也值得注意的是,您对strpos()的使用是不正确的(但是很多人都犯了同样的错误)。即:

代码语言:javascript
复制
if (strpos ($ohreally, 'hello')) {
  ...
}

如果指针位于字符串中的0位置,则不会进入条件块。正确的用法是:

代码语言:javascript
复制
if (strpos ($ohreally, 'hello') !== false) {
  ...
}

因为类型杂耍。否则,0将转换为false。

票数 7
EN

Stack Overflow用户

发布于 2010-01-19 13:03:28

疯狂的想法,但是为什么不在两个单独的循环中测试两个'n‘千次,都被微时间()所包围;以及相关的调试输出。

基于上面对1,000次迭代的代码(有几处更正),我得到了如下内容:

代码语言:javascript
复制
strpos test:     0.003315
preg_match test: 0.014241

因此,在这种情况下(有其他人概述的限制),strpos看起来确实更快,尽管数量很大程度上是没有意义的。(无意义的微观优化等joy )

从不估计你能测量到什么.

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2093535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档