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代码
Nov 27 PHP
PHP ? EasyUI DataGrid 资料取的方式介绍
Nov 07 PHP
PHP处理JSON字符串key缺少双引号的解决方法
Sep 16 PHP
php操作xml入门之cdata区段
Jan 23 PHP
php实现数组按指定KEY排序的方法
Mar 30 PHP
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析
May 18 PHP
用php和jQuery来实现“顶”和“踩”的投票功能
Oct 13 PHP
Smarty模板常见的简单应用分析
Nov 15 PHP
PHP进程通信基础之信号
Feb 19 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
Mar 10 PHP
为何说PHP引用是个坑,要慎用
Apr 02 PHP
解决Laravel 不能创建 migration 的问题
Oct 09 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
对Session和Cookie的区分与解释
2007/03/16 PHP
php伪静态之APACHE篇
2014/06/02 PHP
WordPress中自定义后台管理界面配色方案的小技巧
2015/12/29 PHP
PHP使用imagick扩展实现合并图像的方法
2017/04/25 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
2018/06/06 PHP
JavaScript中去掉数组中的重复值的实现方法
2011/08/03 Javascript
JS实现点击图片在当前页面放大并可关闭的漂亮效果
2013/10/18 Javascript
Javascript对象属性方法汇总
2013/11/21 Javascript
谷歌地图打不开的解决办法
2014/08/07 Javascript
更快的异步执行(setTimeout多浏览器)
2014/08/12 Javascript
jQuery获取iframe的document对象的方法
2014/10/10 Javascript
jQuery中live()方法用法实例
2015/01/19 Javascript
在Python中使用glob模块查找文件路径的方法
2015/06/17 Javascript
jquery判断checkbox是否选中及改变checkbox状态的实现方法
2016/05/26 Javascript
jQuery EasyUI API 中文帮助文档和扩展实例
2016/08/01 Javascript
Angular中使用ui router实现系统权限控制及开发遇到问题
2016/09/23 Javascript
原生JS简单实现ajax的方法示例
2016/11/29 Javascript
详解Vue2.0里过滤器容易踩到的坑
2017/06/01 Javascript
vue+iview写个弹框的示例代码
2017/12/05 Javascript
Python实现批量把SVG格式转成png、pdf格式的代码分享
2014/08/21 Python
python机器学习库常用汇总
2017/11/15 Python
Python判断一个list中是否包含另一个list全部元素的方法分析
2018/12/24 Python
Python中的十大图像处理工具(小结)
2019/06/10 Python
python实现随机漫步方法和原理
2019/06/10 Python
PyCharm 创建指定版本的 Django(超详图解教程)
2019/06/18 Python
Django框架表单操作实例分析
2019/11/04 Python
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
Ruby如何实现动态方法调用
2012/11/18 面试题
详解如何解决使用JSON.stringify时遇到的循环引用问题
2021/03/23 Javascript
大学生求职中的自我评价
2013/10/01 职场文书
医学院学生求职简历的自我评价
2013/10/24 职场文书
优秀员工演讲稿
2014/05/19 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书
企业爱心捐款倡议书
2015/04/27 职场文书
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
2021/06/22 Python
mysql如何能有效防止删库跑路
2021/10/05 MySQL