摘要:例子代碼上午內(nèi)存消耗量環(huán)境執(zhí)行命令結(jié)果返回內(nèi)存消耗量結(jié)果返回內(nèi)存消耗量測試結(jié)果論述通過代碼的執(zhí)行,比較除了標(biāo)準(zhǔn)函數(shù)和自定義函數(shù)之間的異同。標(biāo)準(zhǔn)函數(shù),該函數(shù)將轉(zhuǎn)換為一個。使用場景,可查閱參考資料參考資料實際生產(chǎn)中的使用
什么是生成器Generators
生成器允許你在 foreach 代碼塊中寫代碼來迭代一組數(shù)據(jù)而不需要在內(nèi)存中創(chuàng)建一個數(shù)組, 那會使你的內(nèi)存達到上限,或者會占據(jù)可觀的處理時間。相反,你可以寫一個生成器函數(shù),就像一個普通的自定義函數(shù)一樣, 和普通函數(shù)只返回一次不同的是, 生成器可以根據(jù)需要 yield 多次,以便生成需要迭代的值。
一個簡單的例子就是使用生成器來重新實現(xiàn) range() 函數(shù)。 標(biāo)準(zhǔn)的 range() 函數(shù)需要在內(nèi)存中生成一個數(shù)組包含每一個在它范圍內(nèi)的值,然后返回該數(shù)組, 結(jié)果就是會產(chǎn)生多個很大的數(shù)組。 比如,調(diào)用 range(0, 10000) 將導(dǎo)致內(nèi)存占用超過 4 MB。
例子代碼
= 0) { throw new LogicException("Step must be -ve"); } for ($i = $start; $i >= $limit; $i += $step) { yield $i; } } } if ($argc === 1) { $iterate = rangeWithGenerators(0, $num, 1); foreach ($iterate as $value){ echo $value . " "; } //var_dump(iterator_to_array($iterate)); } if ($argc === 2) { $test = range(0, $num, 1); foreach ($test as $value) { echo $value . " "; } } $end = xdebug_memory_usage(); echo sprintf("內(nèi)存消耗量%s ", convert($end-$start)); function convert($size){ $unit=array("b","kb","mb","gb","tb","pb"); return @round($size/pow(1024,($i=floor(log($size,1024)))),2)." ".$unit[$i]; }
環(huán)境
PHP7.1
Xdebug
執(zhí)行命令
php test.php 結(jié)果返回:內(nèi)存消耗量416 b
php test.php range 結(jié)果返回:內(nèi)存消耗量4 mb
測試結(jié)果論述
通過代碼的執(zhí)行,比較除了PHP標(biāo)準(zhǔn)函數(shù)rang()和自定義函數(shù)rangeWithGenerators()之間的異同。實現(xiàn)了同樣的目的,卻消耗著不同的內(nèi)存,生成器的優(yōu)點顯而易見。
rangeWithGenerators()使用了生成器,而生成器的關(guān)鍵就是使用yield關(guān)鍵詞,yield常見的使用涉及到foreach和for兩個流程控制語句。rangeWithGenerators()中for循環(huán)yield變量$i(yield可理解為生成-值,如同return可理解為返回-值)。
rangeWithGenerators()函數(shù)返回的便是一個生成器Generators( 使用var_dump($iterate)查看其類型 )。
既然rangeWithGenerators()函數(shù)返回的是一個生成器,我們可以使用以下兩種方式來使用:
foreach循環(huán)該Generators,本例子中則使用該方法讀取Generators。
PHP標(biāo)準(zhǔn)函數(shù)iterator_to_array(),該函數(shù)將Generators轉(zhuǎn)換為一個Array。
使用場景,可查閱參考資料2
參考資料:
http://php.net/manual/zh/lang...
實際生產(chǎn)中的使用
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/29153.html
摘要:上下文路徑為了方便文件流的輸入輸出,使用兩種位置環(huán)境。目標(biāo)上下文目標(biāo)上下文定義為當(dāng)前工作目錄或含文件最接近的父文件夾。這確保了用戶行為的一致。幫助用戶嚴重需要覆蓋的內(nèi)容。 摘要 隨著 Web 2.0 和 HTML 5 的流行,現(xiàn)在的 Web 應(yīng)用所能提供的功能和交互能力比之前傳統(tǒng)的 Web 應(yīng)用要強大很多。應(yīng)用的很多實現(xiàn)邏輯被轉(zhuǎn)移到了瀏覽器端來實現(xiàn)。瀏覽器不再只提供單一的數(shù)據(jù)接收和展現(xiàn)...
摘要:更多擴展包中有豐富的擴展包來幫你完成幾乎任何你想實現(xiàn)的功能。我們不能把所有的擴展包都整理出來,然而,這里還是列出了一些很有用的。總之,你幾乎總是能夠找到一個擴展包可以解決你當(dāng)前的問題。 Laravel 是一個非常流行且簡單易用的PHP框架,它提供了很多基礎(chǔ)的工具(如 RESTful 路由、內(nèi)置的ORM、模版等)使你能夠快速的創(chuàng)建應(yīng)用。這意味著你可以花費更少的時間來建立應(yīng)用程序的模版,給...
摘要:什么是在中什么時候需要是中的包管理器。允許我們?yōu)榘惭b各種模塊,這個包管理器為我們提供了安裝刪除等其它命令來管理模塊。 showImg(https://user-gold-cdn.xitu.io/2019/7/11/16bde5b2df52a924?w=4000&h=2667&f=jpeg&s=450648); 本文為您分享「Node.js 入門你需要知道的 10 個問題」這些問題可能也...
閱讀 1435·2021-11-22 15:24
閱讀 2529·2021-10-11 11:06
閱讀 2337·2021-10-09 09:45
閱讀 2535·2021-09-09 09:33
閱讀 642·2019-08-30 15:53
閱讀 1447·2019-08-30 12:48
閱讀 682·2019-08-29 13:47
閱讀 508·2019-08-26 18:27