2011-10-14 42 views
21

我當前的Web應用程序使用約30左右的Contants(DEFINE())。我正在閱讀變量更快的東西。假設有一個避免變量重寫的命名約定,我所看到的唯一的另一個缺點就是這些變量必須被定義爲全局變量,一些如何在每個函數中定義。哪個更快?常量,變量或變量陣列

哪個更快?我在整個應用程序中使用這些常量,並且可能會永遠向列表中添加更多,並且它們被用於函數和類中。

+15

「不成熟的優化是萬惡之源」。告訴我,如果你能測量任何差異;) – KingCrunch

+4

節省的時間是如此渺茫,它不值得任何考慮。 –

+0

什麼時候值得這個優化?每次引用常量是否有成本?這比當你引用一個變量時多嗎?這30個常量是每個頁面上的參考100。 – David

回答

23

使用define()定義的常量在PHP中相當慢。人們實際上寫了擴展名(如hidef)以改善性能。

但是,除非你有常量的負載,這應該沒有太大的區別。

從PHP 5.3開始,您還可以使用編譯時常量const NAME = VALUE;。這些速度要快得多。

+4

你定義的負載是什麼?我有大約30個,每頁被引用次數爲100次 – David

+1

@David 30並不多。只有數百個常量纔會出現問題。 – NikiC

11

這種差異真的很小(微型優化)。你最好將一些常量封裝在類中,這樣你就可以通過Classname::CONSTANT來訪問它們,從而不會污染應用程序的全局名稱空間。

-1

我也無法想象任何速度差異都是必然的。在許多情況下,變量比常量更容易使用,這當然是正確的。

然而,看起來你真正的問題是你有一堆配置數據,你想避免必須將大量變量傳遞給函數,或者必須使它們全部全局化。

沒有一個適用於所有人的答案,但是一個流行的解決方案是使用註冊表類或自己創建一個註冊表類。你可以通過聲明一個php數組來很容易地做到這一點。然後你初始化註冊表對象,你的函數和類通過靜態方法調用來訪問它。作爲例子,我不會提供片段,而只是以zend_configzend_registry爲例。雖然ZF提供了這些功能,但您不應該害怕推出自己的版本,因爲如果您想避免在項目中使用ZF,那麼這兩個版本都不會以更簡單的形式重新創建。

7

快速測試表明,定義常量(define('FOO', 'bar');)比定義一個變量($foo = 'bar';),但使用已定義的慢大約16至18倍(常數)值大約快4到6倍。