PHP 使用队列 SplQueue 类学习记录

项目中发现
关于php SplQueue类--队列 学习记录
查看手册

关于php SplQueue类--队列 学习记录
运行代码 比较数组队列 和 SplQueue

list($t1, $t2) = explode(' ', microtime());
$st = (float)sprintf('%.0f', (floatval($t1) + floatval($t2)) * 1000);

$splq = new SplQueue;
for($i = 0; $i < 100000; $i++)
{
    $data = "hello $i\n";
    $splq->enqueue($data);

    if ($i % 100 == 99 and count($splq) > 100)
    {
        $popN = rand(10, 99);
        for ($j = 0; $j < $popN; $j++)
        {
            $splq->dequeue();
        }
    }
}
list($t1, $t2) = explode(' ', microtime());
$et = (float)sprintf('%.0f', (floatval($t1) + floatval($t2)) * 1000);

echo $et - $st;
echo "\n";

list($t1, $t2) = explode(' ', microtime());

$st = (float)sprintf('%.0f', (floatval($t1) + floatval($t2)) * 1000);
$arrq = array();
for($i = 0; $i <100000; $i++)
{
    $data = "hello $i\n";
    array_push($arrq, $data);
    if ($i % 100 == 99 and count($arrq) > 100)
    {
        $popN = rand(10, 99);
        for ($j = 0; $j < $popN; $j++)
        {
            array_shift($arrq);
        }
    }
}
$popN = count($arrq);
for ($j = 0; $j < $popN; $j++)
{
    array_shift($arrq);
}

list($t1, $t2) = explode(' ', microtime());
$et = (float)sprintf('%.0f', (floatval($t1) + floatval($t2)) * 1000);

echo $et - $st;
echo "\n";

果然差距还是相当大
关于php SplQueue类--队列 学习记录

参考文章:www.cnblogs.com/itsuibi/p/10870608...

数组每次出队入队内存地址都会移动会很慢,php就用Splqueue类来实现队列。
具体Splqueue怎么实现的,就下回再学习了,简单记录一下。

本作品采用《CC 协议》,转载必须注明作者和本文链接
放肆疯狂,委婉洒脱。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 1

我猜猜,应该是树的存储结构不同。SplQueue 树的叶子节点存储的是一个线性表,既存储了自己又存储了前后节点。就像mysl的InnoDB存储引擎的索引B+树一样,最低层叶子节点维护的是一个链表。所以遍历树的时候就快了。

如果有错误请纠正。

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!