我經常在我的web應用程序中使用函數sizeof($var)
,我想知道是否更好(在資源方面)將此值存儲在新變量中並使用此變量,或者如果最好每次調用/使用功能;或者可能無動於衷:)每次調用函數還是將該值存儲在新變量中都更好?
回答
我跑這個小陣列的循環方面的一些測試:
$myArray = array("bill", "dave", "alex", "tom", "fred", "smith", "etc", "etc", "etc");
// A)
for($i=0; $i<10000; $i++) {
echo sizeof($myArray);
}
// B)
$sizeof = sizeof($myArray);
for($i=0; $i<10000; $i++) {
echo $sizeof;
}
隨着9項的數組:
A) took 0.0085 seconds
B) took 0.0049 seconds
以180項的數組:
A) took 0.0078 seconds
B) took 0.0043 seconds
隨着3600件物品的排列:
A) took 0.5-0.6 seconds
B) took 0.35-0.5 seconds
儘管沒有太大差別,但可以看到隨着數組的增長,差異變得越來越大。我認爲這讓我重新思考我的觀點,並從現在開始說,我將設置變量預循環。
Storing a PHP integer takes 68 bytes of memory.這是一個足夠小的數量,我想我寧願處理時間比內存空間。
如果您一遍又一遍地調用函數,最好將此信息保存在一個變量中。這樣服務器不必處理答案,它只是查找它。但是,如果結果可能改變,最好繼續運行該功能。
還值得注意的是,作爲最佳實踐,這裏存在可伸縮性問題。由於過多的函數調用,軟件的每次運行可能只會遭受毫秒級的性能低下,但如果您的應用程序開始被數百萬人使用,則這些毫秒會變成秒,分鐘和數小時的服務器處理時間。 – 2011-04-19 13:34:55
那麼對於變量的存儲是不是會一樣呢?無論哪種方式 - 你會去處理器使用或內存空間。我的假設是,當你接觸到數以百萬計的人時,你會繼續增加更多的硬件,這會影響這些差異 - y/n? – Dave 2011-04-19 13:43:29
我只是覺得這是一個很好的做法。如果到達結果需要幾百行來處理,甚至是數據庫調用,那麼將結果存儲在變量中是一個非常好的主意。既然這顯然是真的,爲什麼不把它作爲你的標準實踐,即使對於較小的功能? – 2011-04-19 13:46:45
除非您將此功能調用一百萬次,否則您的「性能提升」將可以忽略不計。
我不認爲它真的很重要。從某種意義上說,你不想一次又一次地做同樣的事情,但考慮到它是sizeof();
,除非它是一個巨大的數組,否則你應該沒問題。
通常,最好將可能重複的函數的結果賦值給變量。
在你建議的例子中,這種方法產生的處理代碼和替代方法(反覆調用函數)的區別是微不足道的。但是,如果涉及的功能更復雜,最好避免重複執行。
例如:
for($i=0; $i<10000; $i++) {
echo date('Y-m-d');
}
執行我的服務器上0.225273秒,而:
$date = date('Y-m-d');
for($i=0; $i<10000; $i++) {
echo $date;
}
執行0.134742秒。我知道這些片段並不完全相同,但您明白了。很多用戶在很多月份或幾年內加載很多頁面,即使是這種大小的差異也可能很大。如果我們要使用一些複雜的功能,可以引入嚴重的可伸縮性問題。
不將一個返回值分配給一個變量的主要優點是你需要少一行代碼。在PHP中,我們可以經常在同一時間調用我們的功能做我們的任務:
$sql = "SELECT...";
if(!$query = mysql_query($sql))...
...雖然這有時鼓勵可讀性原因。
在我看來,爲了保持一致性,將返回值分配給變量是一種更好的方法,即使在執行簡單函數時也是如此。
我認爲,你應該避免同樣的結構:
for ($i = 0; $i < sizeof($array), $i += 1) {
// do stuff
}
爲,將的sizeof執行每一次迭代,即使它往往是不太可能改變。
而在結構是這樣的:
while(sizeof($array) > 0) {
if ($someCondition) {
$entry = array_pop($array);
}
}
你往往別無選擇,只能計算它的每一個迭代。
由於您分配了一個新的變量,這會佔用更多的內存。但它可能會讓你的代碼更快一點。
它帶來的麻煩可能很大。例如,如果您包含另一個應用相同技巧的文件,並將這些文件的大小存儲在var $sizeof
中,則可能會發生不良情況。奇怪的錯誤,發生在你不期望的時候。或者你忘記在你的功能中添加global $sizeof
。
有很多可能的錯誤,你介紹什麼?由於速度增益可能無法衡量,我認爲這不值得。
- 1. 存儲函數結果還是每次調用它?
- 2. 我應該每次使用全局變量還是調用函數? C++
- 3. 將getter值保存在變量中而不是多次調用會更好嗎?
- 4. 每次使用變量時,PHP函數都會被調用嗎?
- 5. 每次調用jquery函數時都會增加變量
- 6. 每次調用函數時都不要執行存儲在數組中的jQuery
- 7. 每次更新路由時都會調用一個函數vue.js
- 8. 將某個值緩存在數據庫表中還是每次重新計算它會更好?
- 9. 如何將函數調用值存儲到變量node.js
- 10. 我應該將字符串值存儲在變量中還是作爲隱藏的輸入值存儲
- 11. 將函數存儲在變量中
- 12. 每次在python中調用時,更新__init__中的自變量
- 13. 我應該將數組存儲到mysql還是將每個值分別存儲在表中?
- 14. 我怎麼能讓Math.random()在每次調用存儲在其中的變量時都返回不同的值?
- 15. 將用戶數據存儲在$ rootScope中 - 好還是壞?
- 16. 將函數名稱存儲在變量中並使用該變量調用函數是一種不好的做法嗎?
- 17. 爲什麼在函數中每次更改後都存儲多個對象?
- 18. 多次讀取值或首次將變量存儲爲變量?
- 19. 什麼時候應該將函數存儲到變量中?
- 20. 如何將函數的返回值存儲在變量中?
- 21. 如何將函數的返回值存儲在變量中?
- 22. 無法將函數值存儲在變量中
- 23. SQL計數多對多的值還是每次添加新行時都計數?
- 24. 當進行相同的PDO查詢(改變參數)時,我每次都調用prepare(),還是隻調用一次?
- 25. Python:每次調用函數時都輸出一個編號變量?
- 26. 使用函數中的值更新全局變量;它存儲在一個變量中
- 27. 哪一個是在調用函數更好:兩次或存放在變量的結果呢?
- 28. 我應該將對象保存爲地塊還是單獨存儲變量?
- 29. 我應該使用成員變量還是在函數內聲明變量?
- 30. 如何調用名稱存儲在變量中的函數?
更好地使用功能每次 – diEcho 2011-04-19 13:26:08
@diEcho:作出回答,而不是評論 – 2011-04-19 15:04:27
我已經編輯我的答案下面的測試 - 我認爲這是你在找什麼。 – Dave 2011-04-19 15:13:37