【问题标题】:Does really SplFixedArray perform better than arrays?SplFixedArray 真的比数组表现更好吗?
【发布时间】:2012-08-03 09:18:35
【问题描述】:

我正在测试 SplFixedArray 构建一个包含星期几的数组,我得到以下结果:

<?php

$days = new SplFixedArray(7);

$days[0] = "Monday";
$days[1] = "Tuesday";
$days[2] = "Wednesday";
$days[3] = "Thursday";
$days[4] = "Friday";
$days[5] = "Saturday";
$days[6] = "Sunday";

echo memory_get_peak_usage() . "\n"; //Returns 327688
echo memory_get_usage() . "\n"; //Returns 327140
echo memory_get_peak_usage(true) . "\n"; //Returns 524288
echo memory_get_usage(true) . "\n"; //Returns 524288 

使用传统数组:

<?php

$days = array();

$days[0] = "Monday";
$days[1] = "Tuesday";
$days[2] = "Wednesday";
$days[3] = "Thursday";
$days[4] = "Friday";
$days[5] = "Saturday";
$days[6] = "Sunday";

echo memory_get_peak_usage() . "\n"; //Returns 327528
echo memory_get_usage() . "\n"; //Returns 326820
echo memory_get_peak_usage(true) . "\n"; //Returns 524288
echo memory_get_usage(true) . "\n"; //Returns 524288

这对你有意义吗?

【问题讨论】:

  • 你创建的对象和数组...你想要什么???
  • 数组可能太小而无法理解差异。尝试对更大的数组进行基准测试,这就是 SplFixedArray 的用途。

标签: php arrays performance spl


【解决方案1】:

是的,如果您使用固定大小的它们。

如果您不断更改要添加的每个新元素的大小,可能会更慢,这也可能不是错误的用法。

由于在 PHP 中实现数组,因此速度更快,这些数组不是编程语言中的每个定义的真实数组,而是使用哈希表实现的关联数组。 (所以 PHP 中的数组基本上是哈希表)

虽然 SplFixedArray 是使用 C 的“malloc”作为一个几乎普通的 C 数组来实现的,但当然包裹在一个小结构中以跟踪和操作数组作为每个用例。

更新

同时从 PHP 7.x 开始,性能没有太大的时间差异。 真正了解的唯一方法是根据您自己的用例进行基准测试。 如果没有特殊要求,普通的PHParray就足够了。

【讨论】:

    【解决方案2】:

    SplFixedArray 应该比数组快。它没有说明内存消耗(这是您在此处测试的内容)。来自http://php.net/manual/en/class.splfixedarray.php:

    "SplFixedArray 和普通 PHP 数组的主要区别 是 SplFixedArray 是固定长度的,只允许整数 范围内作为索引。优点是它允许更快 数组实现”

    但是,使用包含 100000 个条目的数组,表明它也使用了更少的 RAM:

    $users = array();
    for ($i=0;$i<100000;$i++) { 
        $users[$i] = array('id' => rand(), 'name' => 'default');
    }
    echo memory_get_peak_usage(true); //returns 31457280
    

    $users = new SplFixedArray(100000);
    for ($i=0;$i<100000;$i++) { 
        $users[$i] = array('id' => rand(),
                'name' => 'default');
    }
    echo memory_get_peak_usage(true); //return 26738688
    

    【讨论】:

    • 但一般来说,SplFixedArrays 实际上确实有更小的内存占用。
    • 你说得对,我测试了它并用结果更新了我的答案,很高兴知道。
    • php.net/manual/en/class.splfixedarray.php "优点是它使用的内存比标准数组少。"
    【解决方案3】:

    正如this article 的作者执行的基准测试所示:

    可以得出结论,SplFixedArray 的内存占用确实更小,但只有在数组元素数量很大时才值得注意。因为从技术上讲,SplFixedArray 也是an instance of a class,而不是传统数组,这就是导致如果由 SplFixedArray 实现的小型数组实际上会消耗更多内存的原因,但是由于这额外的几百个字节保持不变,它变得无关紧要,因为数组的大小会增加。

    旁注:不要进行微优化,并不是每个锤子都是为每个钉子创建的。 SplFixedArray 适用于极端情况,例如对于数十万个元素的数组,每个元素减少几个字节的内存使用对整体内存使用有很大影响;但除非您确实确定您的数组是或可能是应用程序的潜在瓶颈,否则不要费心使用它。

    【讨论】:

    • 除了性能之外的另一个用例是使用 SplFixedArray 作为表达意图,告诉代码的读者这确实是一个数组而不是哈希表或其他任何东西。所以我认为 SplFixedArray 不是 only 用于“极端情况”。
    猜你喜欢
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 2013-04-07
    • 2022-01-05
    • 2010-10-07
    • 1970-01-01
    相关资源
    最近更新 更多