佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > php使用yield對性能提升的測試實(shí)例分析

php使用yield對性能提升的測試實(shí)例分析

熱門標(biāo)簽:服務(wù)器配置 Mysql連接數(shù)設(shè)置 銀行業(yè)務(wù) 團(tuán)購網(wǎng)站 科大訊飛語音識別系統(tǒng) 電子圍欄 阿里云 Linux服務(wù)器

本文實(shí)例講述了php使用yield對性能提升的測試。分享給大家供大家參考,具體如下:

生成器提供了一種更容易的方法來實(shí)現(xiàn)簡單的對象迭代,相比較定義類實(shí)現(xiàn) Iterator 接口的方式,性能開銷和復(fù)雜性大大降低。生成器允許你在 foreach 代碼塊中寫代碼來迭代一組數(shù)據(jù)而不需要在內(nèi)存中創(chuàng)建一個(gè)數(shù)組, 那會使你的內(nèi)存達(dá)到上限,或者會占據(jù)可觀的處理時(shí)間。相反,你可以寫一個(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é):對比發(fā)現(xiàn),可能由于腳本計(jì)算比較簡單,運(yùn)行的時(shí)間沒啥太大變化。明顯發(fā)現(xiàn)使用yield后占用內(nèi)存的量要少很多。說明使用yield還是對性能提升很有幫助的,像類似的一次性拉取大數(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é)》

希望本文所述對大家PHP程序設(shè)計(jì)有所幫助。

您可能感興趣的文章:
  • 詳解Yaf框架PHPUnit集成測試方法
  • PHP單元測試配置與使用方法詳解
  • PHPUnit + Laravel單元測試常用技能
  • PHP使用phpunit進(jìn)行單元測試示例
  • 高質(zhì)量PHP代碼的50個(gè)實(shí)用技巧必備(下)
  • 高質(zhì)量PHP代碼的50個(gè)實(shí)用技巧必備(上)
  • 很讓人受教的 提高php代碼質(zhì)量36計(jì)
  • 寫出高質(zhì)量的PHP程序
  • 淺談如何提高PHP代碼質(zhì)量之端到端集成測試

標(biāo)簽:萍鄉(xiāng) 衢州 江蘇 大理 廣元 蚌埠 衡水 棗莊

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《php使用yield對性能提升的測試實(shí)例分析》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    搜索| 含山县| 道孚县| 彩票| 柳河县| 旅游| 富蕴县| 新余市| 漠河县| 天镇县| 永胜县| 合阳县| 仁化县| 湟中县| 德安县| 常宁市| 遵义市| 东丽区| 安阳县| 文山县| 巴中市| 楚雄市| 德令哈市| 昭通市| 乐都县| 开江县| 千阳县| 祁阳县| 赤峰市| 齐齐哈尔市| 云浮市| 淮安市| 洛浦县| 富锦市| 湘西| 宜黄县| 乐业县| 江安县| 怀柔区| 赤城县| 大同县|