`
syu
  • 浏览: 16083 次
  • 性别: 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在大多数需要替换的情况下会加大系统开销.并不是一个值得提倡的作法 :-(

分享到:
评论

相关推荐

    strlen.php

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

    详解PHP中mb_strpos的使用

    mb_strpos — 查找字符串在另一个字符串中首次出现的位置 Description int mb_strpos ( string $haystack , string $needle [, int $offset = 0 [, string $encoding = mb_internal_encoding() ]] ) //Finds ...

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

    php2go:使用Golang来实现PHP的常见内置函数

    str_replace () ucfirst () lcfirst () ucwords () substr () strrev () number_format () chunk_split () str_word_count () wordwrap () strlen () mb_strlen () str_repeat () strstr () strtr () str_shuffle ()...

    asp马加密解密,请尽快下载使用

    /* author:zhiwushan date:20080411 ...eval(str_replace('eval','echo',$a)); $a = ob_get_clean(); if(strpos($a,'eval(gzinflate(str_rot13(base64_decode')===false) { return $a; } } } ?&gt;

    RSS的解析类库.zip

     str_replace('_', DIRECTORY_SEPARATOR, $class) . '.php'; include $filename; } }rss简易信息聚合(也叫聚合内容)是一种RSS基于XML标准,在互联网上被广泛采用的内容包装和投递协议。RSS(Really Simple...

    php实现子字符串位置相互对调互换的方法 原创

    分享给大家供大家参考,具体如下: &lt;?.../*子字符串位置互换 */ $str1=Tom; $str2=Jack;...$str=This is an example,you see Tom tell Jack something;...function str_change($str,$... $str=substr_replace($str,$str2,$

    处理PPT幻灯片的PHP库.zip

     $class = str_replace('\\', DIRECTORY_SEPARATOR, $class);  $class = join(DIRECTORY_SEPARATOR, array('PhpPresentation', 'Tests', '_includes')) .  substr($class, strlen($prefix));  $...

    php经典实例

    一、字符操作 1、访问子字符串:strpos(); if(strpos($_POST['email'],'@')==false){ echo 'the input content is not a legal email'; } 2、提取子字符串:substr();...3、替换子字符串:substr_replace();

    PHP中strpos、strstr和stripos、stristr函数分析_.docx

    PHP中strpos、strstr和stripos、stristr函数分析_.docx

    php使用substr()和strpos()联合查找字符串中某一特定字符的方法

    本文实例讲述了php使用substr()和strpos()联合查找字符串中某一特定字符的方法。分享给大家供大家参考。具体分析如下: 要求:在下面的字符串中... echo substr($str,0,strpos($str,"||")); ?&gt; 输出内容为admin。 s

    php中字符查找函数strpos、strrchr与strpbrk用法

    ① strpos() 函数返回字符串在另一个字符串中第一次出现的位置,如果没有找到该字符串,则返回 false. 语法:strpos(string,find,start),代码如下: 复制代码 代码如下:$str=”hello world”; //定义字符串1 $result=...

    goutils:这是一个用Go语言开发的辅助库,尤其适用于熟悉PHP内置函数的开发者,将会实现PHP内置函数

    用Go语言实现PHP内置函数 这是一个用Go语言开发的辅助库,尤其是适用于熟悉PHP内置函数的开发者,将实现PHP内置函数。 下载安装 go get -u github....关于命名 ... 例子: package main ...strpos() ...str_replace

    php下使用strpos需要注意 === 运算符

    首先应该知道 strpos 函数可能返回布尔值 FALSE,但也可能返回一个与 FALSE 等值的非布尔值,例如 0 或者""。我们应使用 === 运算符来测试本函数的返回值。

    php使用strpos判断字符串中数字类型子字符串出错的解决方法 原创

    最近的开发中在程序代码里有一个随机数是否在给定字符串里的判断,我用了如下的测试代码: $string='\u4e2d\u5956\u53f7\u7801\uff1a3'; $numtmp=mt_rand(1,10); if(strpos($string,$numtmp)!==false){ echo "恭喜...

    PHP 批量更新网页内容实现代码

    $path=str_replace(“/”,”\\”,$path); //指定文件夹 $path=$path.”\\web\\study\\”; //得到所有文件 $s=explode(“\n”,trim(`dir/b/o:gn $path`)); //得到文件夹下的所有HTML文件名 $num=count($s); for($i=0...

    自写PHP strpos() 函数 查找字符串在另一字符串中第一次出现的位置

    自写PHP strpos() 函数 查找字符串在另一字符串中第一次出现的位置. https://blog.csdn.net/qq_40534785/article/details/87939551

    php中的strpos使用示例

    strpos()函数返回字符串在另一个字符串中第一次出现的位置。如果没有找到该字符串,则返回 false,下面看示例使用方法

Global site tag (gtag.js) - Google Analytics