关于在str_replace前先strpos能提升效能的实际测试
来源:互联网 发布:机器视觉算法选择 编辑:程序博客网 时间:2024/05/10 23:38
网上流行一些关于执行代码效率的内容,实际测试了一下,有一些结果并非像内容中提及的那样
比如有人建议在str_replace前先用strpos进行查找操作,理由是即使没有替换,str_replace 也会为其参数分配内存从而很慢,因此需要用 strpos 先查找,看是否需要替换,如果需要,再替换
其文中给出的效率提升是:
- 如果需要替换:效率几乎相等,差别在 0.1% 左右。
- 如果不需要替换:用 strpos 快 200%。
这跟我实测的结果并不相同.
- <?php
- $a=<<<EOT
- 提高php代码的效率2收藏
- 新一篇: php程序员容易犯的10个错误 | 旧一篇: PHP代码优化
- 这篇杂文翻译整理自网络各路文档资料(见最末的参考资料),尤其是 Ilia Alshanetsky (佩服之至) 在多个 PHP 会议上的演讲,主要是各类提高 PHP 性能的技巧。为求精准,很多部分都有详细的效率数据,以及对应的版本等等。偷懒,数据就不一一给出了,直接给结论,如果需要看原文档,请到文末「参考资料」部分。橙色标题为推荐部分。
- ========================================================
- 静态调用的成员一定要定义成 static (PHP5 ONLY)
- 贴士:PHP 5 引入了静态成员的概念,作用和 PHP 4 的函数内部静态变量一致,但前者是作为类的成员来使用。静态变量和 Ruby 的类变量(class variable)差不多,所有类的实例共享同一个静态变量。
- 静态地调用非 static 成员,效率会比静态地调用 static 成员慢 50-60%。主要是因为前者会产生 E_STRICT 警告,内部也需要做转换。
- 使用类常量 (PHP5 ONLY)
- 贴士:PHP 5 新功能,类似于 C++ 的 const。
- 使用类常量的好处是:
- - 编译时解析,没有额外开销
- - 杂凑表更小,所以内部查找更快
- - 类常量仅存在于特定「命名空间」,所以杂凑名更短
- - 代码更干净,使除错更方便
- (暂时)不要使用 require/include_once
- require/include_once 每次被调用的时候都会打开目标文件!
- - 如果用绝对路径的话,PHP 5.2/6.0 不存在这个问题
- - 新版的 APC 缓存系统已经解决这个问题
- 文件 I/O 增加 => 效率降低
- 如果需要,可以自行检查文件是否已被 require/include。
- 不要调用毫无意义的函数
- 有对应的常量的时候,不要使用函数。
- 虽然使用不多,但是效率提升大概在 3500% 左右。
- 最快的 Win32 检查
- - 不用函数
- - Win98/NT/2000/XP/Vista/Longhorn/Shorthorn/Whistler...通用
- - 一直可用
- 时间问题 (PHP>5.1.0 ONLY)
- 你如何在你的软件中得知现在的时间?简单,「time() time() again, you ask me...」。
- 不过总归会调用函数,慢。
- 现在好了,用 ,不用调用函数,又省了。
- 加速 PCRE
- - 对于不用保存的结果,不用 (),一律用 (?:)
- 这样 PHP 不用为符合的内容分配内存,省。效率提升 15% 左右。
- - 能不用正则,就不用正则,在分析的时候仔细阅读手册「字符串函数」部分。有没有你漏掉的好用的函数?
- 例如:
- strpbrk()
- strncasecmp()
- strpos()/strrpos()/stripos()/strripos()
- 加速 strtr
- 如果需要转换的全是单个字符的时候,用字符串而不是数组来做 strtr:
- 效率提升:10 倍。
- 不要做无谓的替换
- 即使没有替换,str_replace 也会为其参数分配内存。很慢!解决办法:
- - 用 strpos 先查找(非常快),看是否需要替换,如果需要,再替换
- 效率:
- - 如果需要替换:效率几乎相等,差别在 0.1% 左右。
- - 如果不需要替换:用 strpos 快 200%。
- 邪恶的 @ 操作符
- 不要滥用 @ 操作符。虽然 @ 看上去很简单,但是实际上后台有很多操作。用 @ 比起不用 @,效率差距:3 倍。
- 特别不要在循环中使用 @,在 5 次循环的测试中,即使是先用 error_reporting(0) 关掉错误,在循环完成后再打开,都比用 @ 快。
- 善用 strncmp
- 当需要对比「前 n 个字符」是否一样的时候,用 strncmp/strncasecmp,而不是 substr/strtolower,更不是 PCRE,更千万别提 ereg。strncmp/strncasecmp 效率最高(虽然高得不多)。
- EOT;
- $start_time=array_sum(explode(" ",microtime()));
- for($i=0;$i<10000;$i++)
- {
- if(strPos($a,'strncmp')) str_replace("strncmp","",$a);
- }
- echo $Runtime="runtime:".((array_sum(explode(" ",microtime()))-$start_time)*1000)."ms";
- ?>
实际测试下来,在满足替换条件的情况下,
执行Strpos时间是178ms,直接str_replace是113ms.
在不满足替换条件下,strpos加上后是72ms,不加是88ms
由此数据看出.综合而言使用strpos在大多数需要替换的情况下会加大系统开销.并不是一个值得提倡的作法 :-(
- 关于在str_replace前先strpos能提升效能的实际测试
- 模糊测试——在他人攻击您的程序前,先自己攻击
- 关于PHP的strpos函数查找结果在第一个字母时的判定
- 关于strpos函数的一些疑问
- 关于PHP中strpos的问题
- 关于stripos和strpos的区别
- Adobe AIR 3在iOS上图形宣染的效能较AIR 2.7.1提升了约7%
- python在接口测试的实际应用
- Try Catch对效能影响的测试
- 如何提升 SQL Server 2005 的查询效能
- 生涯四度——提升你的生活效能
- 传统企业转向互联网_如何能快速提升研发效能?
- 关于自定义程序的效能优化
- 关于自定义程序的效能优化
- oracle在导入对象前先清除的对象
- fft在不同平台的运行效能
- 回复他人前先回复自己能让自己避免大部分的矛盾
- PHP脚本语言中关于箭号(->)在程序中的解释及strpos()函数的讲解摘要
- Oracle中logmnr包的使用详解
- css实现强制不换行/自动换行/强制换行
- Oracle Form---Types of Key Flexeld Forms
- 网络数据的打包(pack)
- 分页存储过程
- 关于在str_replace前先strpos能提升效能的实际测试
- CAS设置(3)
- 文件系统的管理
- 华夏收藏网首届赛宝大会
- 指针引发的问题(以解决)
- Delphi 2007 的PNGimage
- 关于内存中的各个部分
- HP-UX LVM学习笔记
- 在Tomcat中使用Yale CAS实现单点登陆(SSO) 文章合集