亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

PHP特點之垃圾回收機制3——性能方面考慮的因素

瀏覽:5日期:2022-09-15 14:53:32

在上一節我們已經簡單的提到:回收可能根有細微的性能上影響,但這是把PHP 5.2與PHP 5.3比較時才有的。盡管在PHP 5.2中,記錄可能根相對于完全不記錄可能根要慢些,而PHP 5.3中對 PHP run-time 的其他修改減少了這個性能損失。

這里主要有兩個領域對性能有影響。第一個是內存占用空間的節省,另一個是垃圾回收機制執行內存清理時的執行時間增加(run-time delay)。我們將研究這兩個領域。

內存占用空間的節省

首先,實現垃圾回收機制的整個原因是為了,一旦先決條件滿足,通過清理循環引用的變量來節省內存占用。在PHP執行中,一旦根緩沖區滿了或者調用 gc_collect_cycles()函數時,就會執行垃圾回收。在下圖中,顯示了下面腳本分別在PHP 5.2 和 PHP 5.3環境下的內存占用情況,其中排除了腳本啟動時PHP本身占用的基本內存。

Example #1 內存使用示例

<?php class Foo {public $var = ’3.1415962654’; } $baseMemory = memory_get_usage(); for ( $i = 0; $i <= 100000; $i++ ) {$a = new Foo;$a->self = $a;if ( $i % 500 === 0 ){ echo sprintf( ’%8d: ’, $i ), memory_get_usage() - $baseMemory, 'n';} }?>PHP特點之垃圾回收機制3——性能方面考慮的因素

在這個很理論性的例子中,我們創建了一個對象,這個對象中的一個屬性被設置為指回對象本身。在循環的下一個重復(iteration)中,當腳本中的變量被重新復制時,就會發生典型性的內存泄漏。在這個例子中,兩個變量容器是泄漏的(對象容器和屬性容器),但是僅僅能找到一個可能根:就是被unset的那個變量。在10,000次重復后(也就產生總共10,000個可能根),當根緩沖區滿時,就執行垃圾回收機制,并且釋放那些關聯的可能根的內存。這從PHP 5.3的鋸齒型內存占用圖中很容易就能看到。每次執行完10,000次重復后,執行垃圾回收,并釋放相關的重復使用的引用變量。在這個例子中由于泄漏的數據結構非常簡單,所以垃圾回收機制本身不必做太多工作。從這個圖表中,你能看到 PHP 5.3的最大內存占用大概是9 Mb,而PHP 5.2的內存占用一直增加。

執行時間增加(Run-Time Slowdowns)

垃圾回收影響性能的第二個領域是它釋放已泄漏的內存耗費的時間。為了看到這個耗時時多少,我們稍微改變了上面的腳本,有更多次數的重復并且刪除了循環中的內存占用計算,第二個腳本代碼如下:

Example #2 GC performance influences

<?php class Foo {public $var = ’3.1415962654’; } for ( $i = 0; $i <= 1000000; $i++ ) {$a = new Foo;$a->self = $a; } echo memory_get_peak_usage(), 'n';?>

我們將運行這個腳本兩次,一次通過配置zend.enable_gc 打開垃圾回收機制時,另一次是它關閉時。

Example #3 Running the above script

time php -dzend.enable_gc=0 -dmemory_limit=-1 -n example2.php# andtime php -dzend.enable_gc=1 -dmemory_limit=-1 -n example2.php

在我的機器上,第一個命令持續執行時間大概為10.7秒,而第二個命令耗費11.4秒。時間上增加了7%。然而,執行這個腳本時內存占用的峰值降低了98%,從931Mb 降到 10Mb。這個基準不是很科學,或者并不能代表真實應用程序的數據,但是它的確顯示了垃圾回收機制在內存占用方面的好處。好消息就是,對這個腳本而言,在執行中出現更多的循環引用變量時,內存節省的更多的情況下,每次時間增加的百分比都是7%。

PHP內部 GC 統計信息

在PHP內部,可以顯示更多的關于垃圾回收機制如何運行的信息。但是要顯示這些信息,你需要先重新編譯PHP使benchmark和data-collecting code可用。你需要在按照你的意愿運行./configure前,把環境變量CFLAGS設置成-DGC_BENCH=1。下面的命令串就是做這個事:

Example #4 Recompiling PHP to enable GC benchmarking

export CFLAGS=-DGC_BENCH=1./config.nicemake cleanmake

當你用新編譯的PHP二進制文件來重新執行上面的例子代碼,在PHP執行結束后,你將看到下面的信息:

Example #5 GC statistics

GC Statistics-------------Runs: 110Collected: 2072204Root buffer length: 0Root buffer peak: 10000 Possible Remove from MarkedRoot Buffered buffer grey -------- -------- ----------- ------ZVAL 7175487 1491291 1241690 3611871ZOBJ 28506264 1527980 677581 1025731

主要的信息統計在第一個塊。你能看到垃圾回收機制運行了110次,而且在這110次運行中,總共有超過兩百萬的內存分配被釋放。只要垃圾回收機制運行了至少一次,根緩沖區峰值(Root buffer peak)總是10000.

結論

通常,PHP中的垃圾回收機制,僅僅在循環回收算法確實運行時會有時間消耗上的增加。但是在平常的(更小的)腳本中應根本就沒有性能影響。

然而,在平常腳本中有循環回收機制運行的情況下,內存的節省將允許更多這種腳本同時運行在你的服務器上。因為總共使用的內存沒達到上限。

這種好處在長時間運行腳本中尤其明顯,諸如長時間的測試套件或者daemon腳本此類。同時,對通常比Web腳本運行時間長的? PHP-GTK應用程序,新的垃圾回收機制,應該會大大改變一直以來認為內存泄漏問題難以解決的看法。

標簽: PHP
相關文章:
主站蜘蛛池模板: 欧美综合中文字幕久久 | 久久视频免费在线观看 | 日韩欧美小视频 | 亚洲高清国产品国语在线观看 | 一级毛片卡 | 国产亚洲一区二区精品张柏芝 | 国产在线精品福利91香蕉 | 风间由美理论片在线观看 | 日本一级二级三级久久 | 亚洲精品在线观看视频 | 日本免费一区二区在线观看 | 亚洲国产精品一区二区久久hs | 成人免费精品视频 | 黄色录象一级片 | 一区二区三区在线 | 日本 | 香港性特级黄录像片 | 亚洲一区二区三区高清 | 婷婷色在线播放 | 中日韩欧美一级毛片 | 亚洲国产日韩在线成人蜜芽 | 成人免费看黄网址 | 黄色网址视频免费 | 免费在线一区二区三区 | 2020国产微拍精品一区二区 | 国产尤物视频 | 久久久久久久免费视频 | 免费人成在线视频播放2022 | 在线观看日本污污ww网站 | 波多野吉衣一区二区三区四区 | 国内精品久久影视免费 | 国产在线成人a | 亚洲人成在线精品 | 日本zzzzzzz毛片| 国产啪精品 | 成人综合色站 | 精品视频一区二区三区在线播放 | 亚洲第一区视频在线观看 | 国产精品福利一区二区 | 久久网国产 | 国产日韩欧美综合一区二区三区 | 888午夜不卡理论久久 |