使用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内核中该函数的复杂度也很了解,所以这个小优化才可以做这么好,太厉害了!!!

时间: 2024-09-18 13:14:28

使用PHP原生函数就一定比自定义函数快吗?的相关文章

link中如何调用sqlfunctions以外的函数?如何调自定义函数?

问题描述 link中如何调用sqlfunctions以外的函数?如何调自定义函数? link中如何调用sqlfunctions以外的函数?如何调自定义函数? 解决方案 参考:http://www.cnblogs.com/lyj/archive/2008/03/19/1112356.html

PHP移动互联网开发笔记(4)——自定义函数及数组

一.自定义函数 自定义函数就是我们自己定义的函数,在PHP中自定义函数格式如下: function funname(arg1, arg2, arg3......){ //TODO return values; } <?php function fun($m, $n){ if($m==0 $n==0){ return 0; }else{ $a=$m*$n; return $a; } } $p=2; $h=3; echo $p."*".$h."=".fun($p,

最常用的10个javascript自定义函数

javascript|函数 If there was ever a universal common.js shared among the entire develosphere, you'd fine these ten (plus one bonus) functions. It would be the swiss army knife no developer would go into production without. They have no doubt been teste

php自定义函数的基本语法结构

function 函数名(形参列表) { 函数体; return 语句;} 例:实现一个简单的加.减.乘.除计算器 test.php: <?phprequire 'funcs.php';$num1 = 56;$num2 = 44;$oper = "+";$res = jisuan($num1, $num2, $oper); //调用自定义函数echo "计算结果是:" . $res;?> funcs.php: <?phpfunction jisua

浅谈Excel开发(四) Excel自定义函数

相关文章: 浅谈Excel开发(1) Excel开发概述 浅谈Excel开发(二) Excel 菜单系统 浅谈Excel开发(三) Excel 对象模型 我们知道,Excel中有很多内置的函数,比如求和,求平均,字符串操作函数,金融函数等等.在有些 时候,结合业务要求,这些函数可能不能满足我们的需求,比如我想要一个函数能够从WebService上获取 某只股票的最新价:我想要一个函数能够获取当前的天气情况,这些需求我们可以通过编写Excel自定义 函数(User Define Function

PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)_php技巧

本文实例讲述了PHP自定义函数用法.分享给大家供大家参考,具体如下: Demo1.php <?php //标准函数,内置函数 echo md5('123456'); echo '<br/>'; echo sha1('123456'); echo '阅谁问君诵,水落清香浮.'; ?> Demo2.php <?php //创建函数,不要跟系统的内置函数重名 //函数有个特性,必须调用,才可以执行 //无参数表示()里面是空的,无返回就是函数的程序里没有 return functi

浅谈mysql 自定义函数_Mysql

因为工作需要,要写一个mysql的自定义行数,如下 DELIMITER $$ DROP FUNCTION IF EXISTS `onlineFunction`$$ CREATE FUNCTION `onlineFunction`(rrrr VARCHAR(50)) RETURNS VARCHAR(255) BEGIN IF(rrrr='online') THEN RETURN '上线';END IF; END$$ DELIMITER ; 第一行DELIMITER 定义一个结束标识符,因为MySQ

浅析PHP中call user func()函数及如何使用call user func调用自定义函数_php实例

UCenter源代码里有一个函数call_user_func,开始以为是自己定义的函数,结果到处都找不到.后来才知道call_user_func是PHP的内置函数,该函数允许用户调用直接写的函数并传入一定的参数,下面总结下这个函数的使用方法. call_user_func函数类似于一种特别的调用函数的方法,使用方法如下: <?php function nowamagic($a,$b) { echo $a; echo $b; } call_user_func('nowamagic', "&q

自定义函数实现IE7与IE8不兼容js中trim函数的问题_javascript技巧

本文实例讲述了自定义函数实现IE7与IE8不兼容js中trim函数的方法.分享给大家供大家参考.具体实现方法如下: <html> <head> <title>test</title> <script type="text/javascript"> String.prototype.trim = function() { return this.replace(/(^\s*)|(\s*$)/g, ""); }