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&amp;MYSQL留言板源码
Jul 19 PHP
PHP 字符截取 解决中文的截取问题,不用mb系列
Sep 29 PHP
php 需要掌握的东西 不做浮躁的人
Dec 28 PHP
PHP 引用是个坏习惯
Mar 12 PHP
PHP的cURL库功能简介 抓取网页、POST数据及其他
Apr 07 PHP
基于PHP 面向对象之成员方法详解
May 04 PHP
PHP无限分类(树形类)的深入分析
Jun 02 PHP
Laravel中Facade的加载过程与原理详解
Sep 22 PHP
PHP实现对数字分隔加千分号的方法
Mar 18 PHP
Yii框架数据库查询、增加、删除操作示例
Oct 14 PHP
php 输出缓冲 Output Control用法实例详解
Mar 03 PHP
解决Laravel使用验证时跳转到首页的问题
Nov 17 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 getallheaders无法获取自定义头(headers)的问题
2016/03/23 PHP
php获取文件名称和扩展名的方法
2017/02/07 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
2020/02/27 PHP
键盘控制事件应用教程大全
2006/11/24 Javascript
jQuery数据显示插件整合实现代码
2011/10/24 Javascript
jquery 日期控件datepicker属性详细解析
2013/11/08 Javascript
Javascript中arguments对象详解
2014/10/22 Javascript
js实现兼容IE、Firefox的图片缩放代码
2015/12/08 Javascript
基于Angularjs+mybatis实现二级评论系统(仿简书)
2017/02/13 Javascript
解决nodejs中使用http请求返回值为html时乱码的问题
2017/02/18 NodeJs
JavaScript基本类型值-Undefined、Null、Boolean
2017/02/23 Javascript
angular+ionic返回上一页并刷新页面
2017/08/08 Javascript
Vue动态组件实例解析
2017/08/20 Javascript
JS点击动态添加标签、删除指定标签的代码
2018/04/18 Javascript
AngularJS $http post 传递参数数据的方法
2018/10/09 Javascript
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
2018/10/25 Javascript
[04:48]DOTA2上海特锦赛小组赛第三日 TOP10精彩集锦
2016/02/28 DOTA
python中关于日期时间处理的问答集锦
2013/03/08 Python
Python 机器学习库 NumPy入门教程
2018/04/19 Python
Windows下python3.6.4安装教程
2018/07/31 Python
Python对切片命名的实现方法
2018/10/16 Python
python绘制BA无标度网络示例代码
2019/11/21 Python
python小白学习包管理器pip安装
2020/06/09 Python
python 实现的IP 存活扫描脚本
2020/12/10 Python
CSS3 Notes: -webkit-box-reflect实现倒影的实例
2016/12/08 HTML / CSS
html5移动端自适应布局的实现
2020/04/15 HTML / CSS
BCBG官网:BCBGMAXAZRIA
2017/12/29 全球购物
Ray-Ban雷朋西班牙官网:全球领先的太阳眼镜品牌
2018/11/28 全球购物
新闻专业个人求职信
2013/12/19 职场文书
六查六看剖析材料
2014/02/15 职场文书
学习群众路线的心得体会
2014/11/05 职场文书
一次性工伤赔偿协议书范本
2014/11/25 职场文书
黄石寨导游词
2015/02/05 职场文书
社区服务活动报告
2015/02/05 职场文书
2015年度环卫处工作总结
2015/07/24 职场文书
幼儿园老师新年寄语
2015/08/17 职场文书