欺骗PHP整数

Jas*_*ase 4 php

这与我在这里的帖子有关,但是在PHP中使用Charset检测方向完全不同

本质上,我希望减少许多大型数组导致的内存.

这些数组只是整数,但看到PHP内部使用32位和64位整数(取决于您为CPU类型编译的版本),它会占用内存.

有没有办法欺骗PHP使用8位或16位整数?

我考虑过使用pack(); 为了实现这一目标,我可以拥有一个打包的二进制值数组,并根据需要解压缩它们(是的我知道这会使它变慢但是比加载的替代方法快得多,然后单独运行每个数组,因为你可以流文本通过所以他们都需要在内存中同时保持加快速度)

你能建议任何更好的替代方案吗?我知道它非常hacky但我需要防止巨大的内存激增.

mar*_*rio 7

不要告诉任何人!

class IntegerstringArray IMPLEMENTS ArrayAccess {

    var $evil = "0000111122220000ffff";

                 // 16 bit each


    function offsetExists ( $offset ) {
        return (strlen($this->evil) / 4) - 1 >= $offset;
    }

    function offsetGet ( $offset ) {
        return hexdec(substr($this->evil, $offset * 4, 4));
    }

    function offsetSet ( $offset , $value ) {

        $hex = dechex($value);
        if ($fill = 4 - strlen($hex)) {
            $hex = str_repeat("0",  $fill) . $hex;
        }

        for ($i=0; $i<4; $i++) {
            $this->evil[$offset*4+$i] = $hex[$i];
        }
    }

    function offsetUnset ( $offset ) {
        assert(false);
    }

}
Run Code Online (Sandbox Code Playgroud)

所以你几乎可以创建一个数组对象:

$array = new IntegerstringArray();
$array[2] = 65535;
print $array[2];
Run Code Online (Sandbox Code Playgroud)

它在内部存储一个列表并接受16位整数.阵列偏移必须是连续的.

没有测试过.就像实施指南一样.

  • 我刚刚使用30,000次迭代对所有3个运行基准测试.(16bit int的实际大小,我知道最大值大约是32,000).array - 最快但使用3.42mb splFixedArray - 非常类似于数组速度.他们之间0.001秒,但只用了1.69mb.(超过我的期望.100万次迭代使用标准数组的50%)IntegerstringArray - 迄今为止最慢的.比splFixedArry慢10倍,但使用的是0.43mb.这是在ubuntu 10.10上的64位PHP 5.3.3版本.我想我会追求两全其美.用户可以选择:) (4认同)
  • 刚跑了另一个测试.使用pack('v')而不是十六进制转换速度相同,并将内存减少到0.38mb.我想我会为用户提供2个选项.允许内存保存或允许性能.这将是两个世界中最好的:)也是,记住,在所有情况下,获得而不是设置几乎是两倍慢.数组和splfixedarray中0.02秒,integerstringArray中0.22(包和十六进制转换).但这也是一个for循环,所以循环时间增加了它.再次感谢所有的帮助:DI终于可以完成项目了:D (2认同)