php使用yield對性能提升的測試實例分析
本文實例講述了php使用yield對性能提升的測試。分享給大家供大家參考,具體如下:
生成器提供了一種更容易的方法來實現(xiàn)簡單的對象迭代,相比較定義類實現(xiàn) Iterator 接口的方式,性能開銷和復(fù)雜性大大降低。生成器允許你在 foreach 代碼塊中寫代碼來迭代一組數(shù)據(jù)而不需要在內(nèi)存中創(chuàng)建一個數(shù)組, 那會使你的內(nèi)存達(dá)到上限,或者會占據(jù)可觀的處理時間。相反,你可以寫一個生成器函數(shù),就像一個普通的自定義函數(shù)一樣, 和普通函數(shù)只返回一次不同的是, 生成器可以根據(jù)需要 yield 多次,以便生成需要迭代的值。
有兩個php文件,demo1.php與demo2.php,兩種不同的方式實現(xiàn)求0,到5000之間的數(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 "總共占用的時間為:".$useTime.'秒'.PHP_EOL;
運行結(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
總共占用的時間為: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 "總共占用的時間為:".$useTime.'秒'.PHP_EOL;
運行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
總共占用的時間為:5秒
總結(jié):對比發(fā)現(xiàn),可能由于腳本計算比較簡單,運行的時間沒啥太大變化。明顯發(fā)現(xiàn)使用yield后占用內(nèi)存的量要少很多。說明使用yield還是對性能提升很有幫助的,像類似的一次性拉取大數(shù)據(jù)量的數(shù)據(jù)都可以考慮使用yield實現(xiàn)(數(shù)據(jù)統(tǒng)計等).
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP數(shù)組(Array)操作技巧大全》、《php排序算法總結(jié)》、《PHP數(shù)據(jù)結(jié)構(gòu)與算法教程》、《php程序設(shè)計算法總結(jié)》、《php字符串(string)用法總結(jié)》及《PHP常用遍歷算法與技巧總結(jié)》
希望本文所述對大家PHP程序設(shè)計有所幫助。
相關(guān)文章
php中g(shù)etservbyport與getservbyname函數(shù)用法實例
這篇文章主要介紹了php中g(shù)etservbyport與getservbyname函數(shù)用法,以實例形式分析了getservbyport與getservbyname函數(shù)獲取server端的端口等信息的方法,需要的朋友可以參考下2014-11-11用PHP將Unicode 轉(zhuǎn)化為UTF-8的實現(xiàn)方法(推薦)
下面小編就為大家?guī)硪黄肞HP將Unicode 轉(zhuǎn)化為UTF-8的實現(xiàn)方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02PHP創(chuàng)建文件及寫入數(shù)據(jù)(覆蓋寫入,追加寫入)的方法詳解
這篇文章主要介紹了PHP創(chuàng)建文件及寫入數(shù)據(jù)(覆蓋寫入,追加寫入)的方法,結(jié)合實例形式總結(jié)分析了php文件創(chuàng)建、寫入操作相關(guān)函數(shù)使用技巧,需要的朋友可以參考下2019-02-02適用于php-5.2?的?php.ini?中文版[金步國翻譯]
最近服務(wù)器基本上都是使用了php?5.2.*,以前發(fā)布的版本的php.ini已經(jīng)不適用于現(xiàn)在的版本了,特發(fā)現(xiàn)了這篇文章特分享給大家。2011-04-04