关联数组与SplObjectStorage

Gor*_*onM 29 php oop spl associative-array

我正在研究代码来管理一系列独特的对象.这段代码的第一个原型使用了一个关联数组,基本上就像我一直这样做的那样.

但是,我也热衷于利用已经添加到更现代版本的PHP中的功能,例如SplObjectStorage来实现这一目的,部分原因在于学习体验,部分原因在于它必然会提供优势(我已经看到基准测试表明在很多情况下,SplObjectStorage可以比数组更快.

当前实现有一个关联数组,我在in_array中检查它是否在向对象添加新对象之前是否已经在数组中.

最大的问题,我可以SplObjectStorage看到的是,它似乎并没有(乍)支持键/值关联数组的行为,只能被视为一个索引数组.但是,PHP较新功能的文档不符合语言中较为成熟的部分的文档标准,我可能只是遗漏了一些东西.

我可以使用SplObjectStorage代替关联数组吗?如果是这样,我如何在添加新对象时定义键?更重要的是,与关联数组相比,SplObjectStorage的相对优势和劣势是什么?

Jay*_*aph 26

您不应该将其SplObjectStorage视为键值存储,而应仅仅是一组对象.有什么东西在集合中,但它的位置并不重要.

SplObjectStorage事实上,元素的"关键" 是对象的散列.它使得无法将相同对象实例的多个副本添加到a SplObjectStorage,因此您无需在添加之前检查副本是否已存在.

但是,PHP 5.4有一个新的方法getHash(),你可以覆盖它将返回对象的"哈希".这在某种意义上 - 返回/设置密钥,以便您可以在不同条件下存储它.

的主要优点SplObjectStorage是,你获得大量的方法来处理,并用不同的集(交互的事实contains(),removeAll(),removeAllExcept()).它的速度稍微好一些,但内存使用情况比普通PHP数组.

  • 在我的实验中,splObjectStorage实际上使用的内存少于存储对象散列的一组数组. (5认同)
  • 我实际上进行了速度测试,该测试已发布在这里:http://www.technosophos.com/content/php-splobjectstorage-v-arrays-redux SPLObjectStorage似乎有一个大约10,000个DOMDocuments的甜点,之后性能下降. (4认同)

小智 5

在10000次迭代中运行基准测试后的结果PHP 5.6.13

+------------------+----------------+----------------+---------+
|       Type       |  Time to fill  | Time to check  | Memory  |
+------------------+----------------+----------------+---------+
| SplObjectStorage | 0.021285057068 | 0.019490000000 | 2131984 |
| Array            | 0.021125078201 | 0.020912000000 | 1411440 |
+------------------+----------------+----------------+---------+
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,Array不是明显快SplObjectStorage,但使用34%的内存更少

  • 时间差异只有3%,而不是50%?而34%而不是50%的内存。 (22认同)
  • 根据您的数据,我得到的数组填充时间快了1%,检查时间慢了7%,而内存使用减少了34%。 (3认同)
  • 很高兴看到PHP7中的统计信息。 (3认同)