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 相关文章推荐
php4的session功能评述(一)
Oct 09 PHP
PHP 反射机制实现动态代理的代码
Oct 22 PHP
PHP 字符串分割和比较
Oct 06 PHP
在PHP中实现Javascript的escape()函数代码
Aug 08 PHP
php set_time_limit()函数的使用详解
Jun 05 PHP
PHP获取网站中各文章的第一张图片的代码示例
May 20 PHP
php连接oracle数据库的方法(测试成功)
May 26 PHP
php多线程并发实现方法
Sep 30 PHP
利用switch语句进行多选一判断的实例代码
Nov 14 PHP
PHP实现网站访问量计数器
Oct 27 PHP
php中加密解密DES类的简单使用方法示例
Mar 26 PHP
ThinkPHP5框架中使用JWT的方法示例
Jun 03 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
ThinkPHP CURD方法之limit方法详解
2014/06/18 PHP
PHP的Socket网络编程入门指引
2015/08/11 PHP
php中this关键字用法分析
2016/12/07 PHP
深入浅析安装PhpStorm并激活的步骤详解
2020/09/17 PHP
解决PHPstudy Apache无法启动的问题【亲测有效】
2020/10/30 PHP
可以将word转成html的js代码
2010/04/11 Javascript
JS多物体 任意值 链式 缓冲运动
2012/08/10 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
2013/01/23 Javascript
JQuery 给元素绑定click事件多次执行的解决方法
2014/09/09 Javascript
javascript实现checkBox的全选,反选与赋值
2015/03/12 Javascript
ajax如何实现页面局部跳转与结果返回
2015/08/24 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(基于jquery)
2015/11/18 Javascript
JS简单模拟触发按钮点击功能的方法
2015/11/30 Javascript
实例讲解jquery中mouseleave和mouseout的区别
2016/02/17 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
2016/08/05 Javascript
微信小程序 触控事件详细介绍
2016/10/17 Javascript
微信小程序中使用javascript 回调函数
2017/05/11 Javascript
基于layer.js实现收货地址弹框选择然后返回相应的地址信息
2017/05/26 Javascript
在Vue组件上动态添加和删除属性方法
2018/02/23 Javascript
Python3 replace()函数使用方法
2018/03/19 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
2018/04/17 Python
Django csrf 验证问题的实现
2018/10/09 Python
python格式化输出保留2位小数的实现方法
2019/07/02 Python
python对象转字典的两种实现方式示例
2019/11/07 Python
如何将Pycharm中调整字体大小的方式设置为&quot;ctrl+鼠标滚轮上下滑&quot;
2020/11/17 Python
汽车专业毕业生推荐信
2013/11/12 职场文书
应届毕业生的自我鉴定
2013/11/13 职场文书
好军嫂事迹材料
2014/01/15 职场文书
应届优秀本科大学毕业生自我鉴定
2014/01/21 职场文书
《棉鞋里的阳光》教学反思
2014/04/24 职场文书
2014客服代表实习自我鉴定
2014/09/18 职场文书
导师对论文的学术评语
2015/01/04 职场文书
开幕式邀请函
2015/01/31 职场文书
2019开业庆典剪彩仪式主持词!
2019/07/22 职场文书
聊聊JS ES6中的解构
2021/04/29 Javascript
MySQL连表查询分组去重的实现示例
2021/07/01 MySQL