foreach是對陣列副本進行操作(通過拷貝陣列),而while則通過移動陣列內部指標進行操作,一般邏輯下認為,while應該比foreach快(因為foreach在開始執行的時候首先把陣列複製進去,而while直接移動內部指標。),但結果剛剛相反。
在迴圈裡進行的是陣列「讀」操作,則foreach比while快:
**如下:
foreach ($array as $value)while (list($key) = each($array))
在迴圈裡進行的是陣列「寫」操作,則while比foreach快:
**如下:
foreach ($array as $key => $value)while (list($key) = each($array))
總結:通常認為,foreach涉及到值複製,一定會比while慢,但實際上,如果僅僅是在迴圈裡進行陣列的讀操作,那麼foreach是很
快的,這是因為php採用的複製機制是「引用計數,寫時複製」,也就是說,即便在php裡複製乙個變數,最初的形式從根本上說其實
仍然是引用的形式,只有當變數的內容發生變化時,才會出現真正的複製,之所以這麼做是出於節省記憶體消耗得目的,同時也提公升了
複製的效率。這樣看來,foreach的高效讀操作就不難理解了。另外,既然foreach不適合處理陣列寫操作,那麼我們可以得出乙個結
論,多數情況下,類似foreach ($array as $key => $value)形式的做陣列寫操作得**都應該被替換成while (list($key) =
each($array))。這些技巧產生的速度差異在小專案裡可能並不明顯,但是在類似框架這樣的大專案中,一次請求動輒便會涉及到幾
百幾千幾萬次陣列迴圈操作,差異就會明顯放大。
**:
mysql redis mongodb效能比較
1 redis所有資料都是放在記憶體中的,持久化是使用rdb方式或者aof方式。2 mongodb的所有資料實際上是存放在硬碟的,所有要操作的資料通過mmap的方式對映到記憶體某個區域內。然後,mongodb就在這塊區域裡面進行資料修改,避免了零碎的硬碟操作。至於mmap上的內容flush到硬碟就是...
Mysql count 的多種使用方式效能比較
mysql的count函式用於統計符合條件的記錄數,常用的方式有 1 count 2 count 1 3 count id 4 count col 首先需要明確一點 count函式對於返回的結果集,一行行地判斷,不會統計null值。初學者經常會糾結到底應該使用哪種方式做計數,實際上這四種計數方式是有...
搭建效能比squid高很多的varnish伺服器
varnish是一款高效能的開源http加速器,挪威最大的 使用3臺varnish代替了原來的12臺squid,效能比以前更好。varnish的作者poul henning kamp是freebsd的核心開發者之一,他認為現在的計算機比起1975年已經複雜許多。在1975年時,儲存媒介只有兩種 記憶...