2011-06-17 78 views
4

我正在試驗SplFixedArray。我有一些工作要處理動態數組,我試圖轉換爲更多的內存有效的固定數組(有限的RAM工作)。SplFixedArray :: fromArray - 本地固定數組的內存效率? PHP 5.3.5

閱讀一些PHP文檔,發現在標題的功能,並着手只是應用於陣列,其是這樣的:

$array[x][y]['field'] 

(3D陣列與字符串作爲索引,不可能在固定陣列)通過做

$testArray = SplFixedArray::fromArray(generateArray(256)); 
// generateArray is a function to create the array and set it to zero. 

我檢查了是否可以從這個標準數組中獲得一些內存節省。用數字替換字符串索引,使用相同數量的RAM(94 MB)生成陣列。

如果我正確地使用SplFixedArray(而不是從現有的數組轉換)我低內存用於74mb,但我有很多的功能和rutines與基地的3D數組工作,將是一個痛苦的屁股將所有內容轉換爲「適當的」固定數組。這就是爲什麼當我讀到鄰接SPL :: fromArray時,我跳上了我的椅子。但是通過這些測試,我發現了ZERO內存和速度優勢。

我不正確使用它嗎?這個函數只適用於其他類型的東西嗎?

謝謝!

+1

單個256元素陣列根本不足以利用SPLFixedArray更高效的結構。 – Matthew 2011-06-17 05:30:25

+1

SplFixedArray只是在數組鍵上有所節省,而不是在數值上。仍然有很多PHP zval開銷。與普通的PHP數組不同的是,它是一個純索引列表,而不是字典。但速度優勢並沒有實現,因爲這個特性是不穩定的,解釋器對正常的數組/字典進行了優化。 – mario 2011-06-17 05:32:26

+0

見http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/ - 答案是:這取決於你在做什麼以及你在那裏得到了多少數據。 SplFixedArray可以顯着提高性能。 – Gordon 2011-06-17 07:51:07

回答

8

不足之處在於PHP並沒有設計爲以高效內存的方式處理這樣大的數據結構。你所做的任何事情都不會改變這一點。試圖在256MB VPS內工作是非常困難的,特別是如果你有一個Web服務器和數據庫服務器。

正如我的other question所示,SplFixedArrays使用較少的內存。這是一個事實,你可以在PHP源代碼中查看對象是如何創建的。數字不是謊言。

但它只是一個難題......如果你在數組中存儲了很多大的東西或者正在與其他數據結構一起工作,那麼數組可能不是內存使用的「瓶頸」。

關於SplFixedArray::fromArray(),您肯定會添加到您的高峯使用情況,因爲您現在正在創建兩個數組結構。如果您刪除臨時陣列,那麼您將使用更少的內存......但在此期間,您將使用更多內存。

如果您剛剛編寫自己的函數,將臨時數組的一個元素逐個移出並添加到SplFixedArray中,您可能會使用較少的峯值內存,因爲您不會複製數據結構大小。 (由於寫入時複製,實際節省可能不會那麼大。)

同樣,1024 * 1024尺寸的陣列的一些基準與在每個時隙中的64位整數:

SplFixedArray:   92,914,280 
array:     218,756,976 
SplFixedArray::fromArray 227,147,408 peak, 92,915,088 after 

因此,大家看到,如果加載fromArray,使用的是更多的內存,但是後臨時數組被刪除,這又回到了節省。但是,由於目標是最大限度地減少峯值內存使用量,因此使用fromArray將比簡單使用陣列更差。

3

我的經驗是,大多數Spl類對本地數組性能沒有真正的改進。最好的測試證明是不確定的,更糟糕​​的是,它們顯示Spl庫變慢。

主要優點?它們比陣列更可靠,更一致。 SplFixedArray給你的好處知道索引是int(數字索引,我相信,實際上比字符串索引更快),並且你可以專門設置長度 - 如果你不知道你如何結束與一些bizarro額外的價值。

+1

對於像我這樣的好奇,這裏是我剛剛發現的一些比較基準。 ([johnciacia.com](http://www.johnciacia.com/2011/02/01/array-vs-splfixedarray/),[blog.shay.co](http://blog.shay.co/phps -native-array-vs-splfixedarray-performance /)和[這個PHP手冊頁上的註釋](http://php.net/manual/en/class.splfixedarray.php)) – Wiseguy 2011-06-17 05:04:31

+0

@Wiseguy那麼,那些基準測試當然可以解釋我上次查看這個時得到的混亂迴應。 – cwallenpoole 2011-06-17 05:17:29

0

我也對它進行了一些測試。使用SplFixedArray::fromArray似乎沒有意義。節省的內存幾乎不明顯。