起因是因為有人建議盡量別使用
靜態方法
,但是現在有的架構(
laravel5
&
yii2
又大量使用
靜態方法
,讓我產生了矛盾。度娘告訴我
靜態方法會一直佔用記憶體
,但是
速度會比動態方法快
;
動態方法速度慢
但運行完成後記憶體就銷毀了。。。
測試環境如下(好像環境沒有什麼卵用?):
shell
LinuxMint 17PHP 5.6.9 (cli) (built: Jun 22 2015 00:06:37)
測試代碼如下,很不專業的樣子,望斧正:
php
';$begin = microtime(1);for ($i=0; $i < 1000000; $i++) { (new Test())->dongtai(2);}echo microtime(1)-$begin,'
';printf('memory usage: %01.2f MB', memory_get_usage()/1024/1024);echo '
';$begin = microtime(1);for ($i=0; $i < 1000000; $i++) { Test::jingtai(2);}echo microtime(1)-$begin,'
';printf('memory usage: %01.2f MB', memory_get_usage()/1024/1024);
測試結果如下:
memory usage: 0.23 MB1.0004889965057memory usage: 0.24 MB0.86434984207153memory usage: 0.24 MB
那麼問題來了:
靜態方法
到底是不是如度娘所說,速度快但記憶體無法及時回收,動態方法速度慢但能及時回收記憶體
?
- 除此之外是否還有
其它區別
?
- 是否
不建議大量使用靜態方法
或者壓根就不建議使用靜態方法
?
- 我問這個問題之前可是問過度娘的啊,就是因為眾說紛壇,SO。。。
回複內容:
起因是因為有人建議盡量別使用靜態方法
,但是現在有的架構(laravel5
& yii2
又大量使用靜態方法
,讓我產生了矛盾。度娘告訴我靜態方法會一直佔用記憶體
,但是速度會比動態方法快
;動態方法速度慢
但運行完成後記憶體就銷毀了。。。
測試環境如下(好像環境沒有什麼卵用?):
shell
LinuxMint 17PHP 5.6.9 (cli) (built: Jun 22 2015 00:06:37)
測試代碼如下,很不專業的樣子,望斧正:
php
';$begin = microtime(1);for ($i=0; $i < 1000000; $i++) { (new Test())->dongtai(2);}echo microtime(1)-$begin,'
';printf('memory usage: %01.2f MB', memory_get_usage()/1024/1024);echo '
';$begin = microtime(1);for ($i=0; $i < 1000000; $i++) { Test::jingtai(2);}echo microtime(1)-$begin,'
';printf('memory usage: %01.2f MB', memory_get_usage()/1024/1024);
測試結果如下:
memory usage: 0.23 MB1.0004889965057memory usage: 0.24 MB0.86434984207153memory usage: 0.24 MB
那麼問題來了:
靜態方法
到底是不是如度娘所說,速度快但記憶體無法及時回收,動態方法速度慢但能及時回收記憶體
?
- 除此之外是否還有
其它區別
?
- 是否
不建議大量使用靜態方法
或者壓根就不建議使用靜態方法
?
- 我問這個問題之前可是問過度娘的啊,就是因為眾說紛壇,SO。。。
主要是語義上的差別,執行個體方法(你說的動態方法)與執行個體有關,靜態方法與執行個體無關。
要調用執行個體方法先要建立執行個體,建立執行個體可能有開銷,但效能上的差別並不重要,主要還是看語義。
個人的觀點是在適合的時候使用就行了,存在既有其存在的價值嘛。
比如Yii2中的helpers方法,你總不能先new下,然後在調用吧。
產生靜態檔案的話會好點吧
這點記憶體完全不是你考慮的範圍 先保證資料庫沒瓶頸再說吧
該出手時就出手,沒必要就別出手
PHP的物件導向系統效能沒有面向過程高!千萬別用任何對象!一定要只用用面向過程的方式寫!
PHP的架構都沒有原始PHP直接輸出HTML效能高!千萬別用任何架構!一定要直接用PHP輸出HTML!
逃)