php使用yield對(duì)性能提升的測(cè)試實(shí)例分析
本文實(shí)例講述了php使用yield對(duì)性能提升的測(cè)試。分享給大家供大家參考,具體如下:
生成器提供了一種更容易的方法來(lái)實(shí)現(xiàn)簡(jiǎn)單的對(duì)象迭代,相比較定義類實(shí)現(xiàn) Iterator 接口的方式,性能開(kāi)銷和復(fù)雜性大大降低。生成器允許你在 foreach 代碼塊中寫(xiě)代碼來(lái)迭代一組數(shù)據(jù)而不需要在內(nèi)存中創(chuàng)建一個(gè)數(shù)組, 那會(huì)使你的內(nèi)存達(dá)到上限,或者會(huì)占據(jù)可觀的處理時(shí)間。相反,你可以寫(xiě)一個(gè)生成器函數(shù),就像一個(gè)普通的自定義函數(shù)一樣, 和普通函數(shù)只返回一次不同的是, 生成器可以根據(jù)需要 yield 多次,以便生成需要迭代的值。
有兩個(gè)php文件,demo1.php與demo2.php,兩種不同的方式實(shí)現(xiàn)求0,到5000之間的數(shù)字的平方值并輸出,并打印腳本運(yùn)行的時(shí)間與使用的內(nèi)存大小。
demo1.php
<?php
$startMemory = memory_get_usage();
$startTime = time();
function convert($size)
{
$unit=array('b','kb','mb','gb','tb','pb');
return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}
function squares($start,$stop){
$info = '';
$square = 0;
for($i=$start;$i<$stop;$i++){
$square = $i*$i;
$info .= $i.' squared is '.$square.PHP_EOL;
}
return $info;
}
$info = squares(0,50000);
echo $info.PHP_EOL;
$endTime = time();
$useTime = $endTime-$startTime;
$endMemory = memory_get_usage();
$useMemory = $endMemory-$startMemory;
echo "總共占用的內(nèi)存大小為:".convert($useMemory).PHP_EOL;
echo "總共占用的時(shí)間為:".$useTime.'秒'.PHP_EOL;
運(yùn)行結(jié)果如下:
49993 squared is 2499300049
49994 squared is 2499400036
49995 squared is 2499500025
49996 squared is 2499600016
49997 squared is 2499700009
49998 squared is 2499800004
49999 squared is 2499900001總共占用的內(nèi)存大小為:1.28 mb
總共占用的時(shí)間為:5秒
demo2.php
<?php
$startMemory = memory_get_usage();
$startTime = time();
function convert($size)
{
$unit=array('b','kb','mb','gb','tb','pb');
return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}
function squares($start,$stop){
for($i = $start;$i<$stop;$i++){
yield $i=>$i*$i;
}
}
foreach(squares(0,50000) as $n=>$square ){
echo $n.' squared is '.$square.PHP_EOL;
}
$endTime = time();
$useTime = $endTime-$startTime;
$endMemory = memory_get_usage();
$useMemory = $endMemory-$startMemory;
echo "總共占用的內(nèi)存大小為:".convert($useMemory).PHP_EOL;
echo "總共占用的時(shí)間為:".$useTime.'秒'.PHP_EOL;
運(yùn)行demo2.php結(jié)果如下:
49988 squared is 2498800144
49989 squared is 2498900121
49990 squared is 2499000100
49991 squared is 2499100081
49992 squared is 2499200064
49993 squared is 2499300049
49994 squared is 2499400036
49995 squared is 2499500025
49996 squared is 2499600016
49997 squared is 2499700009
49998 squared is 2499800004
49999 squared is 2499900001
總共占用的內(nèi)存大小為:32 b
總共占用的時(shí)間為:5秒
總結(jié):對(duì)比發(fā)現(xiàn),可能由于腳本計(jì)算比較簡(jiǎn)單,運(yùn)行的時(shí)間沒(méi)啥太大變化。明顯發(fā)現(xiàn)使用yield后占用內(nèi)存的量要少很多。說(shuō)明使用yield還是對(duì)性能提升很有幫助的,像類似的一次性拉取大數(shù)據(jù)量的數(shù)據(jù)都可以考慮使用yield實(shí)現(xiàn)(數(shù)據(jù)統(tǒng)計(jì)等).
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP數(shù)組(Array)操作技巧大全》、《php排序算法總結(jié)》、《PHP數(shù)據(jù)結(jié)構(gòu)與算法教程》、《php程序設(shè)計(jì)算法總結(jié)》、《php字符串(string)用法總結(jié)》及《PHP常用遍歷算法與技巧總結(jié)》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
由php的call_user_func傳reference引發(fā)的思考
由php的call_user_func傳reference引發(fā)的思考,使用call_user_func傳reference的朋友可以參考下。2010-07-07
PHP利用func_get_args和func_num_args函數(shù)實(shí)現(xiàn)函數(shù)重載實(shí)例
這篇文章主要介紹了PHP利用func_get_args和func_num_args函數(shù)實(shí)現(xiàn)函數(shù)重載的方法,實(shí)例展示了PHP實(shí)現(xiàn)重載的具體方法,是非常實(shí)用的技巧,需要的朋友可以參考下2014-11-11
PHP之生成GIF動(dòng)畫(huà)的實(shí)現(xiàn)方法
本篇文章是對(duì)PHP生成GIF動(dòng)畫(huà)的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
php中$_GET與$_POST過(guò)濾sql注入的方法
這篇文章主要介紹了php中$_GET與$_POST過(guò)濾sql注入的方法,包含了addslashes_deep函數(shù)與數(shù)組的操作方法,是非常具有實(shí)用價(jià)值的技巧,需要的朋友可以參考下2014-11-11
DedeCMS 核心類TypeLink.class.php摘要筆記
DedeCMS 核心類TypeLink.class.php摘要筆記,學(xué)習(xí)php就是借鑒與分析,讓自己的掌握的更多。2010-04-04
php調(diào)整gif動(dòng)畫(huà)圖片尺寸示例代碼分享
這篇文章主要介紹了如何使用php調(diào)整gif動(dòng)畫(huà)圖片尺寸,大家可以參考使用2013-12-12

