`
syu
  • 浏览: 16628 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

关于在str_replace前先strpos能提升效能的实际测试

阅读更多

网上流行一些关于执行代码效率的内容,实际测试了一下,有一些结果并非像内容中提及的那样

比如有人建议在str_replace前先用strpos进行查找操作,理由是即使没有替换,str_replace 也会为其参数分配内存从而很慢,因此需要用 strpos 先查找,看是否需要替换,如果需要,再替换
其文中给出的效率提升是:
- 如果需要替换:效率几乎相等,差别在 0.1% 左右。
- 如果不需要替换:用 strpos 快 200%。

这跟我实测的结果并不相同.

  1. <?php
  2. $a=<<<EOT
  3. 提高php代码的效率2收藏
  4. 新一篇:php程序员容易犯的10个错误|旧一篇:PHP代码优化
  5. 这篇杂文翻译整理自网络各路文档资料(见最末的参考资料),尤其是IliaAlshanetsky(佩服之至)在多个PHP会议上的演讲,主要是各类提高PHP性能的技巧。为求精准,很多部分都有详细的效率数据,以及对应的版本等等。偷懒,数据就不一一给出了,直接给结论,如果需要看原文档,请到文末「参考资料」部分。橙色标题为推荐部分。
  6. ========================================================
  7. 静态调用的成员一定要定义成static(PHP5ONLY)
  8. 贴士:PHP5引入了静态成员的概念,作用和PHP4的函数内部静态变量一致,但前者是作为类的成员来使用。静态变量和Ruby的类变量(classvariable)差不多,所有类的实例共享同一个静态变量。
  9. 静态地调用非static成员,效率会比静态地调用static成员慢50-60%。主要是因为前者会产生E_STRICT警告,内部也需要做转换。
  10. 使用类常量(PHP5ONLY)
  11. 贴士:PHP5新功能,类似于C++的const
  12. 使用类常量的好处是:
  13. -编译时解析,没有额外开销
  14. -杂凑表更小,所以内部查找更快
  15. -类常量仅存在于特定「命名空间」,所以杂凑名更短
  16. -代码更干净,使除错更方便
  17. (暂时)不要使用require/include_once
  18. require/include_once每次被调用的时候都会打开目标文件!
  19. -如果用绝对路径的话,PHP5.2/6.0不存在这个问题
  20. -新版的APC缓存系统已经解决这个问题
  21. 文件I/O增加=>效率降低
  22. 如果需要,可以自行检查文件是否已被require/include
  23. 不要调用毫无意义的函数
  24. 有对应的常量的时候,不要使用函数。
  25. 虽然使用不多,但是效率提升大概在3500%左右。
  26. 最快的Win32检查
  27. -不用函数
  28. -Win98/NT/2000/XP/Vista/Longhorn/Shorthorn/Whistler...通用
  29. -一直可用
  30. 时间问题(PHP>5.1.0ONLY)
  31. 你如何在你的软件中得知现在的时间?简单,「time()time()again,youaskme...」。
  32. 不过总归会调用函数,慢。
  33. 现在好了,用,不用调用函数,又省了。
  34. 加速PCRE
  35. -对于不用保存的结果,不用(),一律用(?:)
  36. 这样PHP不用为符合的内容分配内存,省。效率提升15%左右。
  37. -能不用正则,就不用正则,在分析的时候仔细阅读手册「字符串函数」部分。有没有你漏掉的好用的函数?
  38. 例如:
  39. strpbrk()
  40. strncasecmp()
  41. strpos()/strrpos()/stripos()/strripos()
  42. 加速strtr
  43. 如果需要转换的全是单个字符的时候,用字符串而不是数组来做strtr
  44. 效率提升:10倍。
  45. 不要做无谓的替换
  46. 即使没有替换,str_replace也会为其参数分配内存。很慢!解决办法:
  47. -用strpos先查找(非常快),看是否需要替换,如果需要,再替换
  48. 效率:
  49. -如果需要替换:效率几乎相等,差别在0.1%左右。
  50. -如果不需要替换:用strpos快200%。
  51. 邪恶的@操作符
  52. 不要滥用@操作符。虽然@看上去很简单,但是实际上后台有很多操作。用@比起不用@,效率差距:3倍。
  53. 特别不要在循环中使用@,在5次循环的测试中,即使是先用error_reporting(0)关掉错误,在循环完成后再打开,都比用@快。
  54. 善用strncmp
  55. 当需要对比「前n个字符」是否一样的时候,用strncmp/strncasecmp,而不是substr/strtolower,更不是PCRE,更千万别提eregstrncmp/strncasecmp效率最高(虽然高得不多)。
  56. EOT;
  57. $start_time=array_sum(explode("",microtime()));
  58. for($i=0;$i<10000;$i++)
  59. {
  60. if(strPos($a,'strncmp'))str_replace("strncmp","",$a);
  61. }
  62. echo$Runtime="runtime:".((array_sum(explode("",microtime()))-$start_time)*1000)."ms";
  63. ?>

实际测试下来,在满足替换条件的情况下,

执行Strpos时间是178ms,直接str_replace是113ms.

在不满足替换条件下,strpos加上后是72ms,不加是88ms

由此数据看出.综合而言使用strpos在大多数需要替换的情况下会加大系统开销.并不是一个值得提倡的作法 :-(

分享到:
评论

相关推荐

    str_replace只替换一次字符串的方法

    另一种方法是编写自定义函数,如`str_replace_once`,它首先通过`strpos`函数找到要替换的字符串的第一个出现位置,然后利用`substr_replace`函数进行替换。下面是一个示例实现: ```php function str_replace_...

    php字符串替换函数substr_replace()用法实例

    substr_replace()函数在实际应用中非常灵活,它不仅可以在字符串的任何位置替换指定长度的子字符串,还可以通过设置特定的参数值实现插入和删除操作。如果$length参数为0,则该函数会将$replacement插入到指定的起始...

    详解PHP中mb_strpos的使用

    这个函数在处理非ASCII或UTF-8等多字节编码的字符串时尤其有用,因为它能正确处理多种字符编码,确保在不同语言环境下也能准确找到子字符串的位置。 函数的签名如下: ```php int mb_strpos ( string $haystack , ...

    Php复习函数集.pdf

    Str_ireplace 函数与 Str_replace 函数类似,但 Str_ireplace 函数是不区分大小写的,例如,Str_ireplace("a", "1", "$a") 将字符串 "$a" 中的 "a" 或 "A" 替换为 "1"。 3. Strrev 函数 Strrev 函数用于将字符串...

    strlen.php

    有关于,PHP中字符串的处理的相关函数,strlen()函数统计字符串中字符的个数,str_word_count()函数统计字符串中单词...找不到返回false,str_replace('字符串中替换的字符','替换后的字符','字符串')字符穿的替换函数

    php如何实现只替换一次或N次

    另一种方法是创建一个名为`str_replace_limit`的函数,它使用`preg_replace`,但确保了正确处理特殊字符,并提供了类似`str_replace`的接口。函数的实现如下: ```php function str_replace_limit($search, $...

    PHP函数壁纸

    `str_replace()`函数则可以用来替换字符串中的特定字符或子串,不仅可以去除特定字符,还能替换为其他字符。如果需要处理字符串中间的空格,可以使用`preg_replace()`函数,它支持正则表达式,能更灵活地匹配和替换...

    PHP常用字符串函数用法实例总结

    1. 字符串分割函数:explode() 和 implode() explode() 函数可以将一个字符串按照...在实际应用中,开发者还应结合具体业务逻辑,适当处理可能出现的异常情况,如处理空值和非法输入等,以确保代码的健壮性和可靠性。

    php截取字符串的类.zip

     $this-&gt;start_pos = strpos($this-&gt;str, $this-&gt;start_str) strlen($this-&gt;start_str);  $this-&gt;end_pos = strpos($this-&gt;str, $this-&gt;end_str);  $this-&gt;c_str_l = $this-&gt;end_pos - $this-&gt;start...

    ecmall插件

    $code = str_replace('{goods_image_url}', site_url() . '/' . $val['default_image'], $code); $content .= $code; unset($code); } $this-&gt;js_write($content); $this-&gt;js_write($data['footer']); $this-...

    基于PHP中自带的字符串操作函数合集

    - str_replace(search,replace,$str):在整个$str字符串中查找所有search并用replace替换。 - str_irreplace():同str_replace,但不区分大小写。 - strtr($str,search,replace):把$str中的search替换为replace...

    php str_getcsv把字符串解析为数组的实现方法

    由于我们指定了引号(`'`)作为包围字符,所以即使字段内包含逗号,`str_getcsv()`也能正确识别并保持字段的完整性。 ### 应用场景 - 当处理用户上传的CSV文件时,`str_getcsv()`可以用来读取每一行并将其转换为数...

    字符串 php

    - `str_replace()`用于替换字符串中的指定部分,例如`str_replace('old', 'new', $str)`。 - `strstr()`查找子字符串并返回其后的部分,`true`表示包含子字符串,`false`表示不包含。 6. **字符串分割与合并**: ...

    PHP常用函数学习

    2. **`str_ireplace()`**:与`str_replace()`类似,但不区分大小写。 3. **`strtr()`**:此函数用于替换字符串中的多个字符。 ```php $newStr = strtr($str, array('search' =&gt; 'replace', ...)); ``` 4. **`...

    PHP常用函数大全.pdf

    - `str_replace`、`str_ireplace`、`str_replace`、`str_rot13`、`str_shuffle` 等函数用于字符串的替换、旋转、随机排列等。 - `str_split` 将字符串分割成数组。 - `str_word_count` 计算字符串中的单词数。 - `...

    php字符串函数集锦

    例如,`str_replace("old", "new", "The old string")`将返回"The new string"。 8. **strstr()** 和 **stristr()**:这两个函数用于查找字符串中指定子串的第一个出现,并返回从该位置到字符串结尾的部分。`strstr...

    PHP常用函数.pdf

    - `str_replace(search, replace, $str)`:在`$str`中查找`search`并替换为`replace`。 - `str_irreplace(search, replace, $str)`:与`str_replace`相同,但不区分大小写。 - `strtr($str, search, replace)`:...

Global site tag (gtag.js) - Google Analytics