【问题标题】:Is there an equivalent to C++'s std::vector in PHP?PHP中是否有与C++的std::vector等价的东西?
【发布时间】:2023-03-07 02:18:01
【问题描述】:

当我不需要任何相关的数组功能时,是否可以使用 PHP 的 array 的轻量级替代品?据我所知,array 在内部是一个哈希映射,对于存储简单的元素数组来说是过度且低效的。如果 PHP 有一个类似于 C++ 的std::vector 的类或编程结构,那就太好了。

参考:http://www.cplusplus.com/reference/vector/vector/

【问题讨论】:

  • 来自the documentation:[PHP 数组] 针对多种不同用途进行了优化;它可以被视为数组、列表(向量)、哈希表(映射的实现)、字典、集合、堆栈、队列等等。 你想做什么,具体来说,数组在哪里给你添麻烦了吗?
  • 具体来说,PHP“数组”同时实现为哈希表和双向链表。虽然这确实意味着插入和删除操作会带来一些额外的开销来维护各种指针,但所有类型的检索都得到了相当大的优化。
  • @IMSoP 那么不仅PHP的原生数组在时间方面效率低下,而且在内存方面也是如此?
  • @DesmondHume 实际上我试图反驳相反的观点。请记住,PHP 是一种高级语言:即使是单个整数也被实现为一个相对复杂的结构来管理写时复制、类型处理、内存管理等。如果你'重新寻找紧凑的内存结构,使用较低级别的语言。
  • 这听起来有点像过早的优化。或者您在项目中是否遇到了原生数组存在问题的具体案例?

标签: php arrays performance


【解决方案1】:

看看 SPL 数据结构。一个例子是http://www.php.net/manual/en/class.splfixedarray.php,它比普通数组更快。

http://www.php.net/manual/en/spl.datastructures.php

【讨论】:

  • SPLFixedArray 在随机访问方面比标准 PHP 数组更快;顺序访问稍微慢一些(例如 foreach());但可以节省大量内存。相反,对于顺序访问,SPLDoublyLinkedLists 比标准 PHP 数组更快 - 很高兴看到 SPL 数据结构被推荐
  • SplFixedArray 是固定的。 std::vector 不是。
  • @Gordon 是的,你是对的。 SplFixedArray 只是一个例子,由于 OP 没有告诉具体的用例,所以很难判断它是否适合需要。
  • 可能仍然可以使用SplFixedArray 类的setSize 方法php.net/manual/en/splfixedarray.setsize.php 实现类似于std::vector 的行为
【解决方案2】:

不,PHP 没有严格等效于std::vector。

我们只使用我们的multi-purpose arrays 或additional datastructures in SPL 之一,即SplFixedArray、ArrayObject 和一些Heaps 和Stacks,但它们实际上都不是等效的。

我能想到的最接近节省内存的方法是PECL extension for Judy Arrays:

PHP Judy 实现了稀疏动态数组(又名 Judy 数组)。此扩展基于 Judy C 库。 Judy 数组仅在填充时才消耗内存,但如果需要,可以增长以利用所有可用内存。 Judy 的主要优势是可扩展性、高性能和内存效率。

支持以下模式:

  • BITSET - 将 Judy 数组定义为位集,其中键为整数,值为布尔值
  • INT_TO_INT - 将键/值定义为整数的 Judy 数组,并且仅限整数。
  • INT_TO_MIXED - 定义 Judy 数组,其中键为整数和任何类型的值。
  • STRING_TO_INT - 定义 Judy 数组,其中键为字符串,值为整数,并且仅限整数。
  • STRING_TO_MIXED - 定义 Judy 数组,其中键为字符串和任何类型的值。

您可能想要INT_TO_MIXED。就像我说的,这是我能想到的最接近的。这是不一样的。之前没用过,不知道在效率上是否满足你的要求。

您可以在http://lxr.php.net/xref/PECL/Judy/浏览源代码

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 2011-08-13
    • 2011-09-25
    • 2018-05-26
    • 2014-10-14
    • 2012-12-30
    • 2020-07-21
    • 1970-01-01
    相关资源
    最近更新 更多