PHP原生函数一定好吗?

 更新时间:2014年12月08日 10:41:42   投稿:hebedich  
本文介绍了php的一个原生函数及其优化后的函数执行效率对比,得出结论,php原生函数不一定是最合适的。

今天在阅读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的倍数时,结果出乎我的意料:

首先是使用原生函数的结果:

 

下面是使用自定义函数的结果:

 

为了结果比较准确,我在做个图表统计

统计次数 原生函数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面向对象的方法重载两种版本比较

    “重载”是类的多态的一种实现。函数重载指一个标识符被用作多个函数名,且能够通过函数的参数个数或参数类型将这些同名的函数区分开来,调用不发生混淆。这样做的主要好处就是,不用为了对不同的参数类型或参数个数,而写多个函数。
    2008-09-09
  • Linux(CentOS)下PHP扩展PDO编译安装的方法

    Linux(CentOS)下PHP扩展PDO编译安装的方法

    这篇文章主要介绍了Linux(CentOS)下PHP扩展PDO编译安装的方法,详细说明了Linux下安装PHP的PDO扩展所涉及的相关技巧与详细步骤,需要的朋友可以参考下
    2016-04-04
  • 一文详解PHP连接MySQL数据库的三种方式

    一文详解PHP连接MySQL数据库的三种方式

    PHP与MySQL的连接有三种API接口,分别是:PHP的MySQL扩展 、PHP的mysqli扩展 、PHP数据对象(PDO)。本文将详解这三种方式的示例代码,需要的可以参考一下
    2022-05-05
  • PHP实现字节数Byte转换为KB、MB、GB、TB的方法

    PHP实现字节数Byte转换为KB、MB、GB、TB的方法

    这篇文章主要介绍了PHP实现字节数Byte转换为KB、MB、GB、TB的方法,结合实例形式分析了php针对字节数Byte的换算操作具体实现方法,涉及php数学运算相关函数的使用,需要的朋友可以参考下
    2017-08-08
  • php命名空间学习详解

    php命名空间学习详解

    这篇文章主要介绍了php命名空间的相关问题和技巧,需要的朋友可以参考下
    2014-02-02
  • PHP mkdir创建文件夹实现方法解析

    PHP mkdir创建文件夹实现方法解析

    这篇文章主要介绍了PHP mkdir创建文件夹实现方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • php中get_meta_tags()、CURL与user-agent用法分析

    php中get_meta_tags()、CURL与user-agent用法分析

    这篇文章主要介绍了php中get_meta_tags()、CURL与user-agent用法,以实例形式较为详细的分析了get_meta_tags()、CURL与user-agent使用时的注意事项与用法,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • 浅析PHP中的UNICODE 编码与解码

    浅析PHP中的UNICODE 编码与解码

    本篇文章是对PHP中的UNICODE 编码与解码进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用

    PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用

    前几篇系列文章,我比较关注的是 PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数 但是我觉得我还是没有说清楚,我自己也有很多不理解的地方,而且这篇是我的第一篇这方面的文章,有很多的纰漏,所以我会经常性的去做修改,如果大家有好的意见不妨告知一、二
    2012-05-05
  • php 读取文件头判断文件类型的实现代码

    php 读取文件头判断文件类型的实现代码

    以下是对使用php实现读取文件头判断文件类型,支持图片、rar、exe等后缀进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-08-08

最新评论