2014-09-30 83 views
0

在許多WordPress主題和框架,我發現這行代碼:調用函數多次或儲存返回值,性能方面

<!--[if lt IE 7]><html <?php language_attributes(); ?> class="no-js lt-ie9 lt-ie8 lt-ie7"><![endif]--> 
<!--[if IE 7]><html <?php language_attributes(); ?> class="no-js lt-ie9 lt-ie8"><![endif]--> 
<!--[if IE 8]><html <?php language_attributes(); ?> class="no-js lt-ie9"><![endif]--> 
<!--[if gt IE 8]><!--> <html <?php language_attributes(); ?> class="no-js"><!--<![endif]--> 

我注意到了language_attributes()我認爲多個呼叫是即使花費不必要的時間這樣一個簡單的功能,所以我用這個代碼:

<?php ob_start(); language_attributes(); $language_attributes = ob_get_clean(); ?> 

<!--[if lt IE 7]><html <?php echo $language_attributes; ?> class="no-js lt-ie9 lt-ie8 lt-ie7"><![endif]--> 
<!--[if IE 7]><html <?php echo $language_attributes; ?> class="no-js lt-ie9 lt-ie8"><![endif]--> 
<!--[if IE 8]><html <?php echo $language_attributes; ?> class="no-js lt-ie9"><![endif]--> 
<!--[if gt IE 8]><!--> <html <?php echo $language_attributes; ?> class="no-js"><!--<![endif]--> 

<?php unset($language_attributes); ?> 

避免調用language_attributes()多次,但更多的我看到使用了更多的,我懷疑我的決定的第一圖案,所以我決定問專家意見上。

所以,這裏是我的問題:

在更廣泛的方面

- 不侷限於此特定的功能 - 如果函數做精確的每一次

什麼是過多次調用一個函數的好處存儲返回值?

一樣,有沒有在php一些隱藏的緩存機制,那些運行時間的函數調用所以這樣我就不需要存儲返回值的緩存。

+1

wordress並不完全知道*性能* – 2014-09-30 19:46:24

+0

性能明智,你應該剖析網站,並修復造成問題的東西。除非你有充分的理由(例如,如果你知道速度很慢),否則你不應該注意這類東西。 – 2014-09-30 19:48:59

+0

如果你自己寫自己,你永遠不會這樣做,但如果你想要超級靈活並容納所有的廣告,模板等有時候會發生這種情況,它是生活中的一種折衷 – 2014-09-30 19:50:32

回答

1

要直接,我可以回答你的問題,它依賴。功能是否每次都做同樣的事情,性能成本如何?函數緩存/返回一個容易計算的值而不觸及存儲?它會被opcached或以其他方式運行時緩存?所有這些都會影響您對電話的決定。

除此之外,還有更多的問題要問。你爲什麼關心這個電話?你有沒有衡量它的影響?你測量了更高的穀物嗎?堆棧的其他部分?假設你沒有測量任何東西,有可能會更有效的噸優化。

說了這麼多,這是一個很好的機會,這是不成熟的優化,而不是你應該考慮自己。我建議The Mature Optimization Handbook,它涵蓋了廣泛的這個話題,並應該幫助你在你的道路上。

+0

好吧,讓我開始說,這個具體的調用不是我唯一關心的,我的意思是:如果函數每次都確實有一些隱藏的'php'中的緩存機制,它可以執行函數調用的運行時緩存所以這樣我不需要存儲返回的值? – Aboalnaga 2014-09-30 20:11:33

+0

謝謝,對於這本書的參考,它實際上似乎可以幫助我很多,你的答案是迄今爲止唯一一個觸及我所要求的,我不知道是誰投票給你,爲什麼,我希望你可能有一些關於函數調用的'php'運行時緩存的具體知識,這將有很大的幫助,謝謝你agin – Aboalnaga 2014-09-30 20:28:39

+0

@Bonga:在你編輯你的問題之前,你好像在尋找'get_language_attributes()'。您的新編輯添加了「更廣泛的方面」,「隱藏緩存機制」。 – AbraCadaver 2014-09-30 21:16:58

1

沒有遵循令人費解的Wordpress代碼鏈(我討厭WordPress)沒有辦法知道。函數的實際調用明顯增加了時間,儘管它可能可以忽略不計,但在這種情況下,此函數調用至少會執行另外兩個函數調用。

如果任何函數做了大量的事情(數據庫查詢,包括文件,循環,廣泛的正則表達式等),那麼這可能會導致性能問題。

一般來說,如果你不知道所有功能在做什麼,最好的做法是最好調用一次。除非通話過程中有返回/結果改變的可能性,否則您需要提供不同的信息。

可以使用做到這一點:

$language_attributes = get_bloginfo('language'); 

或者如何工作的:

$language_attributes = str_replace('_', '-', get_locale()); 

Function Reference/get bloginfo

+0

實際上'language_attributes'函數做的不止於此,還有插件應用的過濾器 – Aboalnaga 2014-09-30 20:01:05

+0

它是OP編輯之前答案的一部分。 – AbraCadaver 2014-09-30 21:07:27