之前聽(tīng)到過(guò)的一個(gè)前輩關(guān)于php性能優(yōu)化的說(shuō)法——PHP為我們提供了那么多的原聲函數(shù),我們盡量用原生函數(shù)解決問(wèn)題,但是有時(shí)在想,php原生態(tài)的函數(shù)就一定快嗎?現(xiàn)在看到一個(gè)國(guó)外的人寫(xiě)的函數(shù),就來(lái)測(cè)試一下.
今天在閱讀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(),這里加下劃線開(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;
- } //開(kāi)源軟件:Vevb.com
- $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é)果出乎我的意料.
為了結(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)化才可以做這么好,太厲害了.
|
新聞熱點(diǎn)
疑難解答