PHP原生函数一定好吗?

yipeiwu_com5年前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 进程锁定问题分析研究

1. 区分读锁定 和 写 锁定。 如果每次都使用 写锁定,那么连多个进程读取一个文件也要排队,这样的效率肯定不行。 2. 区分 阻塞 与 非 阻塞模式。 一般来说,如果一个进程在写一个文...

php 各种应用乱码问题的解决方法

1) 使用 标签设置页面编码 这个标签的作用是声明客户端的浏览器用什么字符集编码显示该页面,xxx 可以为 GB2312、GBK、UTF-8(和 MySQL 不同,MySQL 是 UTF...

PHP缓冲区用法总结

本文实例总结了PHP缓冲区用法。分享给大家供大家参考,具体如下: 我们先来看一段代码。 <?php for ($i=10; $i>0; $i--) { ech...

RSA实现JS前端加密与PHP后端解密功能示例

RSA实现JS前端加密与PHP后端解密功能示例

本文实例讲述了RSA实现JS前端加密与PHP后端解密功能。分享给大家供大家参考,具体如下: web前端,用户注册与登录,不能直接以明文形式提交用户密码,容易被截获,这时就引入RSA。 前...

PHPStrom中实用的功能和快捷键大全

有哪些快捷键或者PHPStrom出的特有的功能,让你觉得编写过程变得很舒服和快捷? CTRL + j 能够快捷的输入常用的代码片段,类似vim的 snipMate,可以加入自定义代码片段...