PHP原生函数一定好吗,使用PHP原生函数就一定比自定义函数快吗

图片 4

PHP原生函数一定好吗,使用PHP原生函数就一定比自定义函数快吗

图片 1 

分别用原生函数和自定义函数举行测量检验,在发生0~一千000之内具备的3的翻番时,结果大于我的料想:

function dec2s4($dec) { 
    $base =
‘0123456789_$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’; 
    $result = ”; 

你大概感兴趣的稿子:

  • PHP使用glob函数遍历目录或文件夹的艺术
  • PHP里8个无人问津的平安函数剖析
  • PHP内置的Math函数功效测量检验
  • 多少个实用的PHP内置函数使用指南
  • PHP中SimpleXML函数用法深入分析
  • php中数字、字符与指标决断函数用法实例
  • php字符串截取函数用法解析
  • php中in_array函数用法商讨
  • 可怜实用的PHP常用函数汇总

上面是运用自定义函数的结果:

末段结果:
4位userid+4位秒+3位随机数=拾一人字符串。即使与uniqid()结果看上去相似,可是强壮度有所进步。

下边是选择自定义函数的结果:

 代码如下

<?php
/*
*组成time()函数使用,以一九六三年到方今时间的秒数作为种子数。
*/
$str=time();
echo md5($str);
?>

 /**
  * Fill an array with a range of numbers.
  *
PHP原生函数一定好吗,使用PHP原生函数就一定比自定义函数快吗。  *     // 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();

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);

可取:能够依据输入的种子数据来调控输出的数值,假如种子数据是规律性不重复的,通过md5能够对数据开始展览保证,发生一点都不小的歪曲效用。
症结:三12个人字符过长;需提供不另行的种子数据;
用法:高并发,以秒为种子数据,仍旧相会世重复现象。

   
看来kohana官方对range这些函数至极探听,对php内核中该函数的复杂度也很精通,所以那些小优化才得以做那样好,太狠了!!!

 代码如下

    do { 
        $result = $base[$dec % 64] . $result; 
        $dec = intval($dec / 64); 
    } while ($dec != 0); 

复制代码 代码如下:

从表中能够看到发生随机数时自定义函数比原生函数要节外省部存款和储蓄器和岁月,并且原生函数在调换大批量随意数时极其耗内部存款和储蓄器,消耗费时间间也专程多,而自定义函数在那地点则表现得好,发生的内部存款和储蓄器和消耗的时光基本平稳,看来前面那位前辈说的不料定完全准确哦,不过这里要留意我们那边的自定义函数只好生成数字,而原生的range仍是能够发生字母的,可是小编想那自定义函数增添个假名应该也不会太难~

        if($len) {
            $clen = strlen($return);
            if($clen >= $len) {
                return $return;
            }
            else {
                return str_pad($return, $len, ‘0’, STR_PAD_LEFT);
            }
        }
        return $return;
    }

图片 2 

昨日在翻阅kohana源码中的Arr类的时候开采了那般一个函数

三、进级版方案:

今日在读书kohana源码中的Arr类的时候发掘了那样五个函数

echo $time[‘end’] – $time[‘begin’].’s’.”r”;
echo (memory_get_peak_usage()/1024/1024).”M”;

说明:
1,userid:
64进制最大值“ZZZZ”转换为十进制等于”16777215“,”ZZZ“调换为十进制最大值等于”262143“;
2,秒:设置本身的年月源点。
$less=time()-strtotime(‘2012-4-21’); 转换为64进制”1SpRe“,5位
$less=time()-strtotime(‘2013-3-21’); 转换为64进制”_jHY“;4位
3,随机数:使用random(3)生成3位随机数;

   
分别用原生函数和自定义函数举行测量试验,在产生0~一千000中间具备的3的倍数时,结果出乎作者的料想:

阅览这里的时候,作者发觉php的原声函数也是能够达成那么些职能的,猛然想到以前听到过的三个长辈关于php质量优化的传教——PHP为大家提供了那么多的原声函数,大家尽量用原生函数化解难点。于是本人就做了个测量试验,看看php原生函数质量究竟比自个儿写的快多少。要测量检验的函数有原生函数range()和地点的函数_range(),这里加下划线初叶是因为重写原声函数range()会报错“Fatal
error: Cannot redeclare range() in”。

View Code

   
看到这里的时候,小编意识php的原生函数也是足以实现这几个效能的,猛然想到在此之前听到过的一个前辈关于php质量优化的传教——PHP为大家提供了那么多的原生函数,我们尽量用原生函数消除问题。于是自身就做了个测验,看看php原生函数质量毕竟比自身写的快多少。要测量试验的函数有原生函数range()和方面包车型大巴函数_range(),这里加下划线开头是因为重写原生函数range()会报错“Fatal
error: Cannot redeclare range() in”。

    return $array;
}

二,常规方案:

第一是选拔原生函数的结果:

总的看kohana官方对range那些函数万分摸底,对php内核中该函数的复杂度也很领悟,所以这些小优化本事够做这么好,太厉害了!!!

亮点:贰11个人字符串长度,是足以承受的文书命名长度;能够加上前缀,结果包涵数据混淆,能够制止反推原始数据。
症结:同md5相似,高并发,以秒为种子数据,依然会出现重复现象。

复制代码 代码如下:

    $array = array();
    for ($i = $step; $i <= $max; $i += $step)
    {
        $array[$i] = $i;
    }

1,guid:32 字符十六进制数。
格式:GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,当中种种 x 是
0-9 或 a-f
范围内的一个叁十一位十六进制数。举例:6F9619FF-8B86-D011-B42D-00C04FC964FF
即为使得的 GUID 值。

  return $array;
 }
 

图片 3

3,uniqid():再次回到13或贰11位字符串。
对此大家指标来说,uniqid()疑似md5()的革新版,特别是我们得以选取差别性标志作为字符串前缀,能够下跌再度命名出现的可能率。
对此非高并发等非常景况,推荐使用此函数,已经得以满足通常须求。
详尽表达,
概念:uniqid() 函数基于以飞秒计的脚下时光,生成三个独一的 ID。
用法:uniqid(prefix,more_entropy)
证实:prefix可认为出口的字符串加多前缀,示举个例子下,more_entropy参数为true时,将出口27个人字符串。

 
 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”;

图片 4

复制代码 代码如下:

  $array = array();
  for ($i = $step; $i <= $max; $i += $step)
  {
   $array[$i] = $i;
  }

为了结果相比较标准,作者在做个图表总括
总括次数     原生函数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

2,MD5:
与guid 同样会输出32
字符十六进制数,差异是guid是随机发生的,md5需求基于输入的数目变化。
例子,

计算次数 原生函数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仍是能够发生字母的,可是本人想那自定义函数增添个假名应该也不会太难~

/**
 * 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();

上例中早就冒出了随机数的采纳,是为着缓和一秒下发出的高频恳求。提供八个函数如下,

为了结果比较标准,笔者在做个图表总计

先是是采纳原生函数的结果:

复制代码 代码如下:

输出,

思路:userid+秒+随机数。个中“userid+秒”10进制转64进制,缩减位数;

复制代码 代码如下:

一,适用场景:无法运用从数据库中回到的自拉长数字,给上传图片重命名。

    /**
     * 将64进制的数字字符串转为10进制的数字字符串
     * @param $m string 64进制的数字字符串
     * @param $len integer
重临字符串长度,假如长度远远不够用0填充,0为不填充
     * @return string
     * @author 野马
     */
    function hex64to10($m, $len = 0) {
        $m = (string)$m;
        $hex2 = ”;
        $Code = KeyCode;
        for($i = 0, $l = strlen($Code); $i < $l; $i++) {
            $KeyCode[] = $Code[$i];
        }
        $KeyCode = array_flip($KeyCode);

3,算法效用测验:

    /**
     * 将16进制的数字字符串转为64进制的数字字符串
     * @param $m string 16进制的数字字符串
     * @param $len integer
再次回到字符串长度,假诺长度相当不足用0填充,0为不填充
     * @return string
     * @author 野马
     */
    function hex16to64($m, $len = 0) {
        $KeyCode = KeyCode;
        $hex2 = array();
        for($i = 0, $j = strlen($m); $i < $j; ++$i) {
            $hex2[] = str_pad(base_convert($m[$i], 16, 2), 4, ‘0’,
STR_PAD_LEFT);
        }
        $hex2 = implode(”, $hex2);
        $hex2 = str_rsplit($hex2, 6);
        foreach($hex2 as $one) {
            $hex64[] = $KeyCode[bindec($one)];
        }
        $return = preg_replace(‘/^0*/’, ”, implode(”, $hex64));
        if($len) {
            $clen = strlen($return);
            if($clen >= $len) {
                return $return;
            }
            else {
                return str_pad($return, $len, ‘0’, STR_PAD_LEFT);
            }
        }
        return $return;
    }

admin

网站地图xml地图