之前我提問過static private和private的區別,老徐則說只是訪問方式的區別,我接著說網上有人說static能提高效能,老徐抱有不同見解。
今天,我又再次看到有人這麼說了:1、如果能將類的方法定義成 static,就盡量定義成 static,它的速度會提升將近 4 倍。
這個說法來自於: http://www.php100.com/html/it/focus/2014/0403/6746.html
不知道這個說法是真是假,作者又是怎麼測試並肯定地提出這個說法的呢?
回複討論(解決方案)
static聲明靜態屬性,就可以不執行個體化類而直接存取
他說的提速估計只是對能直接存取不需要執行個體化的屬性 public的
但對於private保護的屬性外部是無法直接存取的 所以也就沒有提速一說了
實踐是檢驗真理的唯一標準
class T { static function foo($n) { return $n + 1; } function foo1($n) { return $n + 1; }}function foo($n) { return $n + 1;}$p = new T;$k = 1000000;$t = microtime(1);for($i=0; $i<$k; $i++) T::foo($i);echo '靜態方法 ',microtime(1) - $t, PHP_EOL;$t1 = microtime(1);for($i=0; $i<$k; $i++) foo($i);echo '獨立函數 ', microtime(1) - $t1, PHP_EOL;$t2 = microtime(1);for($i=0; $i<$k; $i++) $p->foo1($i);echo '對象方法 ', microtime(1) - $t2, PHP_EOL;靜態方法 0.203125
獨立函數 0.203125
對象方法 0.21875
結論你自己下
我感覺看你怎麼比較??
像樓上的比較方式是把 建立對象消耗的效能跟時間排除了 做比較
如果把建立對象放迴圈裡面 對象方法所需時間要更長些
純屬個人看法
依 #3 的說法,加上
$t3 = microtime(1);for($i=0; $i<$k; $i++) { $p = new T; $p->foo1($i);}echo '對象方法 ', microtime(1) - $t3, PHP_EOL;靜態方法 0.234375
獨立函數 0.1875
對象方法 0.234375
對象方法 0.40625
也不會有 4 倍之多
第一次:靜態方法 0.22201204299927 獨立函數 0.20401191711426 對象方法 0.25601506233215
第二次:靜態方法 0.23101305961609 獨立函數 0.20001196861267 對象方法 0.25701403617859
第三次:靜態方法 0.22401285171509 獨立函數 0.19801115989685 對象方法 0.25601482391357
第四次:靜態方法 0.22301316261292 獨立函數 0.20001101493835 對象方法 0.25901484489441
第五次:靜態方法 0.22701287269592 獨立函數 0.19801211357117 對象方法 0.25701403617859
第六次:靜態方法 0.22201204299927 獨立函數 0.19901204109192 對象方法 0.26201510429382
第七次:靜態方法 0.22201204299927 獨立函數 0.20001196861267 對象方法 0.25901484489441
第八次:靜態方法 0.22301316261292 獨立函數 0.19801092147827 對象方法 0.25801491737366
第九次:靜態方法 0.22201204299927 獨立函數 0.19801187515259 對象方法 0.26101493835449
第十次:靜態方法 0.22201299667358 獨立函數 0.20601105690002 對象方法 0.26201486587524
我這裡測試的結果是這樣的,無論怎麼看,對象方法耗時都比靜態方法要長一點點。可能作者指的就是這個意思吧。
是幾倍我就不關心了,我只關心是否快了。
anyway,感謝各位的熱心參與。
如果你很關心這億分之幾秒的時間,那就這樣吧
如果這麼糾結, 可以自己去研究一下緣代碼,就知道情況了
“如果能將類的方法定義成 static,就盡量定義成 static”
如果按這句話來說倒是對的
但怎樣才算"能"?如果大部分方法都弄成static,在某種意義上就不是物件導向的思維了
類和對象我覺得更多更大的考慮是它們之間的起承轉接~
以上純個人意見
使用單例模式的話對象只new一次
也多消耗2#的那點時間和new一次對象時間,差不多可以忽略了
但是說起來單例還是比靜態方法慢一丁點啊,還佔了點記憶體,但是單例支援繼承...
理論上來說肯定是的,實際效能差別在今天的電腦上肯定不是很明顯。
new一下整個類被執行個體化為對象。如果是static方法的話,類只相當於一個name space的作用,把隸屬於其name space下的函數call出來
感謝大家的熱心協助和討論,我獲益良多