[英]Associative Array versus SplObjectStorage
我正在編寫代碼來管理一組獨特的對象。 這段代碼的第一個原型使用了一個關聯數組,基本上我一直都是這樣做的。
但是,我也熱衷於利用已添加到更現代版本的 PHP(例如[SplObjectStorage][1]
功能來代替這樣做,部分是作為學習經驗,部分是因為它一定會提供優勢(基准我已經看到表明SplObjectStorage
在很多情況下可以比數組更快)。
當前實現有一個關聯數組,我使用in_array()
檢查該數組,以在向數組中添加新對象之前查看對象是否已經在數組中。
我可以看到SplObjectStorage
的一個大問題是它似乎(乍一看)不支持鍵/值關聯數組行為,並且只能被視為索引數組。 然而,PHP 新特性的文檔不符合該語言更成熟部分的文檔標准,我可能只是遺漏了一些東西。
我可以使用SplObjectStorage
代替關聯數組嗎? 如果是這樣,在添加新對象時如何定義鍵? 更重要的是,與關聯數組相比, SplObjectStorage
的相對優勢和劣勢是什么?
您不應該將SplObjectStorage
視為鍵值存儲,而只是一組對象。 某些東西是否在集合中,但它的位置並不重要。
SplObjectStorage
元素的“鍵”實際上是對象的哈希值。 這使得無法將同一對象實例的多個副本添加到SplObjectStorage
,因此您不必在添加之前檢查副本是否已存在。
但是,在PHP 5.4
有一個名為getHash()
的新方法,您可以覆蓋它,該方法將返回對象的“哈希”。 這 - 從某種意義上說 - 返回/設置密鑰,以便您可以允許它在不同條件下存儲。
SplObjectStorage
的主要優點是您可以獲得許多用於處理和交互不同集合的方法( contains()
、 removeAll()
、 removeAllExcept()
等)。 它的速度稍好一些,但內存使用比普通的 PHP 數組差。
在PHP 5.6.13
上運行 10000 次迭代的基准測試后的結果:
類型 | 填寫時間 | 檢查時間 | 記憶 |
---|---|---|---|
對象存儲 | 0.021285057068 | 0.019490000000 | 2131984 |
大批 | 0.021125078201 | 0.020912000000 | 1411440 |
如您所見, Array
並沒有明顯快於SplObjectStorage
,但使用的內存減少了 34% 。
當分配給數組的內存全部用完時,分配給它的內存會翻倍。 在這種情況下,對象集合可能是更有效的結構。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.