PHP中是否有一个简单快速的数组?

9
我需要一个在PHP中使用最少内存的简单数组。我想要一个精确的C++等价物,可以使用索引迭代分配的内存块。我发现PHP中的数组比如说:size*type_size(我猜是为了存储键值等)使用更多内存。有没有什么更不复杂和简单的方法?
编辑:
谢谢大家。
是的,我在发布问题后马上想到了字符串的想法。我需要一个布尔数组,所以似乎可以工作。只是它的字符获取/设置速度稍微慢一些。
Judy数组也很有趣,但我还没有尝试过。
我已经尝试过SplFixedArray,但它似乎使用与普通数组相同的内存量(除非我在途中错过了什么)。

2
你怎么可能需要比 array() 更快的速度?如果你需要比 array() 更快的速度,那么你可能在使用错误的编程语言。 - Jan Dragsbaek
1
除非您将项目限制为特定类型(这里的“类型”指固定的sizeof的“C类型”),否则这甚至是不可能的。即使如此,它仍然是一团糟。根据项目的类型和PHP实现,它可能会导致所有访问上的装箱/拆箱,从而使大部分潜在的速度优势失效。 - user395760
5个回答

10

SplFixedArray的性能非常糟糕,因为它是一个PHP对象,并且具有重大的创建开销。话虽如此,一旦创建完成,它的内存和速度就更好了。 - Morg.

9
我需要一个在PHP中占用最少内存的简单数组。 PHP中速度最快的数组类型实际上是字符串。它也是最节省内存的,最接近C等效数据结构的类型。
 $byte = ord($string[123]);

它已经被索引了。但是它的限制当然只适用于字节值。(您并没有详细说明您的需求。所以这是您通用的答案。)

作为固定长度 SplFixedArray 的替代,PHP 还有一个扩展用于 Judy 数组。它们是关联数组,但是与 PHP 相比可以节省内存,并且据说速度更快一些。(在脚本语言中关心这个似乎没有太多意义,但是嘿,谁知道呢。)


@mario。那我们如何高效地创建一个指定长度的字符串呢?比如,一个长度为40k的字符串? - Pacerier
@Pacerier 最常用的方法是使用str_pad。例如,使用str_pad("", 40960, "\0")来生成40K的NUL字节。 - mario
@marioпјҢжңүжІЎжңүжҜ”дҪҝз”ЁordеҮҪж•°жҖ§иғҪжӣҙеҘҪзҡ„жӣҝд»Јж–№жЎҲпјҹ еңЁеӨ§йҮҸдҪҝз”Ёж—¶пјҢordеҫҲж…ўгҖӮ - Pacerier
@Pacerier 你可以尝试使用 $char2int 映射。但我怀疑它不会更快。我看到 ord() 确实是一个函数,而不是语言内置的。但 PHP 不是 C :/ - mario
@mario,char2int 只适用于 int8,并且不具有可扩展性... 它无法适用于 int32 或甚至 int16.... - Pacerier
显示剩余3条评论

3

http://php.net/manual/en/class.splfixedarray.php

SplFixedArray类提供了数组的主要功能。SplFixedArray和普通PHP数组之间的主要区别在于,SplFixedArray是固定长度的,并且只允许范围内的整数作为索引。优点在于它允许更快的数组实现。最接近你可以得到的。

有多快?1% 的加速并不重要。25% 的加速可以决定一个程序或网站的成败。 - David Spector
您正在回答一个十年前的问题,内存和 CPU 力量的现状发生了巨大变化。基于这个答案,今天一台价值35美元的计算机提供的性能与提问时代的普通计算机相当。SO 的政策是保持这些问题和答案不变。https://meta.stackoverflow.com/q/411296/308851 - chx

1

你别无选择。
PHP中的所有数组都是有序映射,没有例外。

如果你在使用数组时遇到了内存问题,我建议你使用一些更相关的技术。
PHP旨在处理每个用户请求到Web服务器的相对较小的数据量。


0

这个答案需要修订或删除,因为链接已经失效。PHP Judy是Judy C库的PECL扩展,实现了动态稀疏数组。 - David Spector

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接