PHP原生函數(shù)一定好嗎?
今天在閱讀kohana源碼中的Arr類(lèi)的時(shí)候發(fā)現(xiàn)了這樣一個(gè)函數(shù)
/**
* 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;
}
看到這里的時(shí)候,我發(fā)現(xiàn)php的原生函數(shù)也是可以實(shí)現(xiàn)這個(gè)功能的,忽然想到之前聽(tīng)到過(guò)的一個(gè)前輩關(guān)于php性能優(yōu)化的說(shuō)法——PHP為我們提供了那么多的原生函數(shù),我們盡量用原生函數(shù)解決問(wèn)題。于是我就做了個(gè)測(cè)試,看看php原生函數(shù)性能究竟比自己寫(xiě)的快多少。要測(cè)試的函數(shù)有原生函數(shù)range()和上面的函數(shù)_range(),這里加下劃線(xiàn)開(kāi)始是因?yàn)橹貙?xiě)原生函數(shù)range()會(huì)報(bào)錯(cuò)“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";
分別用原生函數(shù)和自定義函數(shù)進(jìn)行測(cè)試,在產(chǎn)生0~1000000之間所有的3的倍數(shù)時(shí),結(jié)果出乎我的意料:
首先是使用原生函數(shù)的結(jié)果:
下面是使用自定義函數(shù)的結(jié)果:
為了結(jié)果比較準(zhǔn)確,我在做個(gè)圖表統(tǒng)計(jì)
統(tǒng)計(jì)次數(shù) 原生函數(shù)range() 自定義函數(shù)_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
從表中可以看出產(chǎn)生隨機(jī)數(shù)時(shí)自定義函數(shù)比原生函數(shù)要節(jié)省內(nèi)存和時(shí)間,而且原生函數(shù)在生成大量隨機(jī)數(shù)時(shí)特別耗內(nèi)存,消耗時(shí)間也特別多,而自定義函數(shù)在這方面則表現(xiàn)得好,產(chǎn)生的內(nèi)存和消耗的時(shí)間基本穩(wěn)定,看來(lái)前面那位前輩說(shuō)的不一定完全正確哦,但是這里要注意我們這里的自定義函數(shù)只能生成數(shù)字,而原生的range還可以產(chǎn)生字母的,但是我想這自定義函數(shù)添加個(gè)字母應(yīng)該也不會(huì)太難~
看來(lái)kohana官方對(duì)range這個(gè)函數(shù)很是了解,對(duì)php內(nèi)核中該函數(shù)的復(fù)雜度也很了解,所以這個(gè)小優(yōu)化才可以做這么好,太厲害了?。?!
相關(guān)文章
PHP擴(kuò)展Swoole實(shí)現(xiàn)實(shí)時(shí)異步任務(wù)隊(duì)列示例
這篇文章主要介紹了PHP擴(kuò)展Swoole實(shí)現(xiàn)實(shí)時(shí)異步任務(wù)隊(duì)列,結(jié)合實(shí)例形式分析了PHP擴(kuò)展Swoole實(shí)現(xiàn)實(shí)時(shí)異步任務(wù)隊(duì)列相關(guān)客戶(hù)端與服務(wù)器端操作技巧,需要的朋友可以參考下2019-04-04
php外部執(zhí)行命令函數(shù)用法小結(jié)
這篇文章主要介紹了php外部執(zhí)行命令函數(shù)用法,結(jié)合實(shí)例形式分析了exec與system執(zhí)行外部命令的相關(guān)使用技巧,需要的朋友可以參考下2016-10-10
PHP中一些可以替代正則表達(dá)式函數(shù)的字符串操作函數(shù)
這篇文章主要介紹了PHP中一些可以替代正則表達(dá)式函數(shù)的字符串操作函數(shù),本文總結(jié)的是一些比較特別的字符串操作函數(shù),需要的朋友可以參考下2014-11-11
PHP中全局變量global和$GLOBALS[]的區(qū)別分析
$GLOBALS['var']是外部的全局變量本身,global $var是外部$var的同名引用或者指針2012-08-08
ajax 的post方法實(shí)例(帶循環(huán))
在最近的項(xiàng)目中,為了能解決在大數(shù)據(jù)查詢(xún)中出現(xiàn)的超時(shí)問(wèn)題,需要將大數(shù)據(jù)拆分成小數(shù)據(jù),然后進(jìn)行循環(huán)處理。本人經(jīng)驗(yàn)不足,技術(shù)有限,只能想到用ajax來(lái)傳送數(shù)據(jù)。2011-07-07
PHP 加密 Password Hashing API基礎(chǔ)知識(shí)點(diǎn)
在本篇文章里小編給大家分享的是一篇關(guān)于PHP 加密 Password Hashing API基礎(chǔ)知識(shí)點(diǎn),有興趣的朋友們可以學(xué)習(xí)下。2020-03-03
PHP寫(xiě)API輸出的時(shí)用echo的原因詳解
在本篇文章里小編給大家分享了關(guān)于PHP寫(xiě)API輸出的時(shí)用echo的原因和相關(guān)知識(shí)點(diǎn),需要的朋友們參考下。2019-04-04

