PHP原生函数一定好吗?


Posted in PHP onDecember 08, 2014

今天在阅读kohana源码中的Arr类的时候发现了这样一个函数

 /**

  * Fill an array with a range of numbers.

  *

  *     // Fill an array with values 5, 10, 15, 20

  *     $values = Arr::range(5, 20);

  *

  * @param   integer $step   stepping

  * @param   integer $max    ending number

  * @return  array

  */

 public static function range($step = 10, $max = 100)

 {

  if ($step < 1)

   return array();
  $array = array();

  for ($i = $step; $i <= $max; $i += $step)

  {

   $array[$i] = $i;

  }
  return $array;

 }

 

    看到这里的时候,我发现php的原生函数也是可以实现这个功能的,忽然想到之前听到过的一个前辈关于php性能优化的说法——PHP为我们提供了那么多的原生函数,我们尽量用原生函数解决问题。于是我就做了个测试,看看php原生函数性能究竟比自己写的快多少。要测试的函数有原生函数range()和上面的函数_range(),这里加下划线开始是因为重写原生函数range()会报错“Fatal error: Cannot redeclare range() in”。

 

 function _range($step = 10, $max = 100)

 {

  if ($step < 1)

   return array();

  $array = array();

  for ($i = $step; $i <= $max; $i += $step)

  {

   $array[$i] = $i;

  }

  return $array;

 }

 $time['begin'] = microtime(true);

 $tmp = range(0,1000000,3);

 //$tmp = _range(0,1000000,3);

 $time['end']   = microtime(true);

 echo $time['end'] - $time['begin'].'s'."\r";

 echo (memory_get_peak_usage()/1024/1024)."M";

    分别用原生函数和自定义函数进行测试,在产生0~1000000之间所有的3的倍数时,结果出乎我的意料:

首先是使用原生函数的结果:

PHP原生函数一定好吗? 

下面是使用自定义函数的结果:

PHP原生函数一定好吗? 

为了结果比较准确,我在做个图表统计

统计次数 原生函数range() 自定义函数_range()
(0,1000000,3) 5.155E-3s 27.5530M 1.907E-5s 0.1241M
(0,1000000,2) 7.479E-3s 40.2688M 1.811E-5s 0.1241M
(0,1000,1) 8.16E-5s 0.1620M 2.649E-5s 0.1241M
    从表中可以看出产生随机数时自定义函数比原生函数要节省内存和时间,而且原生函数在生成大量随机数时特别耗内存,消耗时间也特别多,而自定义函数在这方面则表现得好,产生的内存和消耗的时间基本稳定,看来前面那位前辈说的不一定完全正确哦,但是这里要注意我们这里的自定义函数只能生成数字,而原生的range还可以产生字母的,但是我想这自定义函数添加个字母应该也不会太难~

    看来kohana官方对range这个函数很是了解,对php内核中该函数的复杂度也很了解,所以这个小优化才可以做这么好,太厉害了!!!

PHP 相关文章推荐
PHP.MVC的模板标签系统(三)
Sep 05 PHP
PHP配置文件中最常用四个ini函数
Mar 19 PHP
php 接口类与抽象类的实际作用
Nov 26 PHP
PHP优于Node.js的五大理由分享
Sep 15 PHP
Fine Uploader文件上传组件应用介绍
Jan 06 PHP
探讨:使用XMLSerialize 序列化与反序列化
Jun 08 PHP
Codeigniter校验ip地址的方法
Mar 21 PHP
php实现CSV文件导入和导出
Oct 24 PHP
php生成带logo二维码方法小结
Apr 08 PHP
php基于curl实现随机ip地址抓取内容的方法
Oct 11 PHP
PHP耦合设计模式实例分析
Aug 08 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
Mar 01 PHP
thinkphp中ajax与php响应过程详解
Dec 08 #PHP
一款简单实用的php操作mysql数据库类
Dec 08 #PHP
php表单敏感字符过滤类
Dec 08 #PHP
php网页病毒清除类
Dec 08 #PHP
ThinkPHP入口文件设置及相关注意事项分析
Dec 05 #PHP
简单实用的PHP防注入类实例
Dec 05 #PHP
ThinkPHP连接数据库的方式汇总
Dec 05 #PHP
You might like
十天学会php之第七天
2006/10/09 PHP
PHP OPCode缓存 APC详细介绍
2010/10/12 PHP
基于在生产环境中使用php性能测试工具xhprof的详解
2013/06/03 PHP
如何使用PHP给图片加水印
2016/10/12 PHP
PHP-FPM的配置与优化讲解
2019/03/15 PHP
Javascript select下拉框操作常用方法
2009/11/09 Javascript
jQuery each()方法的使用方法
2010/03/18 Javascript
jquery图片切换插件
2015/03/16 Javascript
jQuery取消ajax请求的方法
2015/06/09 Javascript
jQuery实现判断滚动条到底部
2015/06/23 Javascript
js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)
2016/03/09 Javascript
javascript获取wx.config内部字段解决微信分享
2016/03/09 Javascript
Javascript打印局部页面实例
2016/06/21 Javascript
html+js+highcharts绘制圆饼图表的简单实例
2016/08/04 Javascript
AngularJS 过滤器(自带和自建)详解
2016/09/19 Javascript
微信小程序 跳转传参数与传对象详解及实例代码
2017/03/14 Javascript
Mongoose经常返回e11000 error的原因分析
2017/03/29 Javascript
Angular directive递归实现目录树结构代码实例
2017/05/05 Javascript
vue2.0 实现富文本编辑器功能
2019/05/26 Javascript
React中使用UMEditor的方法示例
2019/12/27 Javascript
JavaScript Window浏览器对象模型原理解析
2020/05/30 Javascript
微信小程序地图实现展示线路
2020/07/29 Javascript
js实现简单选项卡制作
2020/08/05 Javascript
[49:02]KG vs Infamous 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Python中使用pprint函数进行格式化输出的教程
2015/04/07 Python
在Docker上开始部署Python应用的教程
2015/04/17 Python
Python中生成Epoch的方法
2017/04/26 Python
python 接口_从协议到抽象基类详解
2017/08/24 Python
python数字图像处理之高级形态学处理
2018/04/27 Python
Python2包含中文报错的解决方法
2018/07/09 Python
Django Rest framework频率原理与限制
2019/07/26 Python
python程序实现BTC(比特币)挖矿的完整代码
2021/01/20 Python
Python LMDB库的使用示例
2021/02/14 Python
入党自我鉴定范文
2013/10/04 职场文书
建筑安全员岗位职责
2015/02/15 职场文书
博士论文答辩开场白
2015/06/01 职场文书