關於static的討論

來源:互聯網
上載者:User
之前我提問過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出來

感謝大家的熱心協助和討論,我獲益良多

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.