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 中的输出缓冲
Dec 21 PHP
php md5下16位和32位的实现代码
Apr 09 PHP
在smarty中调用php内置函数的方法
Feb 07 PHP
php实现把数组按指定的个数分隔
Feb 17 PHP
Yii学习总结之数据访问对象 (DAO)
Feb 22 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
Dec 08 PHP
php 解析xml 的四种方法详细介绍
Oct 26 PHP
php计算给定日期所在周的开始日期和结束日期示例
Feb 06 PHP
php正则提取html图片(img)src地址与任意属性的方法
Feb 08 PHP
PHP实现压缩图片尺寸并转为jpg格式的方法示例
May 10 PHP
php实现等比例压缩图片
Jul 26 PHP
如何在Mac上通过docker配置PHP开发环境
May 29 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
基于mysql的论坛(2)
2006/10/09 PHP
PHP中文件上传的一个问题
2010/09/04 PHP
php启用zlib压缩文件的配置方法
2013/06/12 PHP
php向js函数传参的几种方法
2014/08/10 PHP
使用ThinkPHP生成缩略图及显示
2017/04/27 PHP
使用composer命令加载vendor中的第三方类库 的方法
2019/07/09 PHP
《JavaScript高级程序设计》阅读笔记(二) ECMAScript中的原始类型
2012/02/27 Javascript
自己写的Javascript计算时间差函数
2013/10/28 Javascript
无限树Jquery插件zTree的常用功能特性总结
2014/09/11 Javascript
bootstrap实现弹窗和拖动效果
2016/01/03 Javascript
js+css3制作时钟特效
2016/10/16 Javascript
深入理解JS继承和原型链的问题
2016/12/17 Javascript
详解Js中的模块化是如何实现的
2017/10/18 Javascript
vue中动态设置meta标签和title标签的方法
2018/07/11 Javascript
JS实现判断图片是否加载完成的方法分析
2018/07/31 Javascript
微信上传视频文件提示(推荐)
2018/11/22 Javascript
React 全自动数据表格组件——BodeGrid的实现思路
2019/06/12 Javascript
vue 解决兄弟组件、跨组件深层次的通信操作
2020/07/27 Javascript
Vue组件简易模拟实现购物车
2020/12/21 Vue.js
让python json encode datetime类型
2010/12/28 Python
使用python实现strcmp函数功能示例
2014/03/25 Python
Python中用于去除空格的三个函数的使用小结
2015/04/07 Python
python实现计算倒数的方法
2015/07/11 Python
在Mac OS上搭建Python的开发环境
2015/12/24 Python
浅谈flask截获所有访问及before/after_request修饰器
2018/01/18 Python
python实现微信发送邮件关闭电脑功能
2018/02/22 Python
Opencv实现抠图背景图替换功能
2019/05/21 Python
在python里面运用多继承方法详解
2019/07/01 Python
python程序中的线程操作 concurrent模块使用详解
2019/09/23 Python
Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】
2020/05/29 Python
Reebonz中国官网:新加坡奢侈品购物网站
2017/03/17 全球购物
澳大利亚最超值的自行车之家:Reid Cycles
2019/03/24 全球购物
作风建设演讲稿
2014/05/23 职场文书
超市周年庆活动方案
2014/08/16 职场文书
通用员工手册范本
2015/05/14 职场文书
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技