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函数utf8转gb2312编码
Dec 21 PHP
在任意字符集下正常显示网页的方法一
Apr 01 PHP
PHP MemCached 高级缓存应用代码
Aug 05 PHP
PHP中redis的用法深入解析
Feb 20 PHP
ThinkPHP中的常用查询语言汇总
Aug 22 PHP
PHP实现加强版加密解密类实例
Jul 29 PHP
4种PHP异步执行的常用方式
Dec 24 PHP
Linux环境下php实现给网站截图的方法
May 03 PHP
深入讲解PHP的对象注入(Object Injection)
Mar 01 PHP
php基于自定义函数记录log日志方法
Jul 21 PHP
PHP array_reduce()函数的应用解析
Oct 28 PHP
PHP中遍历数组的三种常用方法实例分析
Jun 24 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 mysql索引问题
2008/06/07 PHP
php循环检测目录是否存在并创建(循环创建目录)
2011/01/06 PHP
PHP对象Object的概念 介绍
2012/06/14 PHP
基于php设计模式中工厂模式详细介绍
2013/05/15 PHP
php 下载保存文件保存到本地的两种实现方法
2013/08/12 PHP
ThinkPHP采用原生query实现关联查询left join实例
2014/12/02 PHP
详解WordPress中调用评论模板和循环输出评论的PHP函数
2016/01/05 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
2016/01/07 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
php5对象复制、clone、浅复制与深复制实例详解
2019/08/14 PHP
javascript中的绑定与解绑函数应用示例
2013/06/24 Javascript
完美解决AJAX跨域问题
2013/11/01 Javascript
jQuery判断元素是否存在的可靠方法
2014/05/06 Javascript
jquery复选框多选赋值给文本框的方法
2015/01/27 Javascript
jQuery插件ajaxfileupload.js实现上传文件
2020/10/23 Javascript
百度搜索框智能提示案例jsonp
2016/11/28 Javascript
jQuery事件详解
2017/02/23 Javascript
详解Vue 事件驱动和依赖追踪
2017/04/22 Javascript
本地搭建微信小程序服务器的实现方法
2017/10/27 Javascript
JS/jQuery实现超简单的Table表格添加,删除行功能示例
2019/07/31 jQuery
node.js如何根据URL返回指定的图片详解
2020/10/21 Javascript
python调用百度地图WEB服务API获取地点对应坐标值
2019/01/16 Python
Python的Tkinter点击按钮触发事件的例子
2019/07/19 Python
django 做 migrate 时 表已存在的处理方法
2019/08/31 Python
Python利用全连接神经网络求解MNIST问题详解
2020/01/14 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
2020/02/28 Python
Python装饰器实现方法及应用场景详解
2020/03/26 Python
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
ECCO英国官网:丹麦鞋履品牌
2019/09/03 全球购物
保密工作目标责任书
2014/07/28 职场文书
2015入党自荐书范文
2015/03/05 职场文书
行政申诉状范文
2015/05/20 职场文书
呼兰河传读书笔记
2015/06/30 职场文书
详解JavaScript中的执行上下文及调用堆栈
2021/04/29 Javascript
Golang中channel的原理解读(推荐)
2021/10/16 Golang
nginx实现动静分离的方法示例
2021/11/07 Servers