Deque vs队列速度

Deque vs Queue Speed

本文关键字:速度 队列 vs Deque      更新时间:2023-10-16

i在leetcode上处理问题(此处)。当我完成问题时,我想到了:

class MovingAverage {
    std::deque<int> numsToAverage;
    int maxSize;
    int currentTotal;
public:
    /** Initialize your data structure here. */
    MovingAverage(int size) {
        maxSize = size;
        currentTotal = 0;
    }
    double next(int val) 
    {
        currentTotal += val;
        numsToAverage.push_back(val);
        if (numsToAverage.size() > maxSize)
        {
            currentTotal -= numsToAverage[0];
            numsToAverage.pop_front();
        }
        return (double)currentTotal / (double)numsToAverage.size();
    }
};

之后,我看到另一个解决方案与我的相似,但使用了队列。出于好奇,我仅将deque交换为队列,然后从第18个百分位数(Deque)跳到了第56个百分位数(Queue)。这是队列代码:

class MovingAverage {
    std::queue<int> numsToAverage;
    int maxSize;
    int currentTotal;
public:
    /** Initialize your data structure here. */
    MovingAverage(int size) {
        maxSize = size;
        currentTotal = 0;
    }
    double next(int val) 
    {
        currentTotal += val;
        numsToAverage.push(val);
        if (numsToAverage.size() > maxSize)
        {
            currentTotal -= numsToAverage.front();
            numsToAverage.pop();
        }
        return (double)currentTotal / (double)numsToAverage.size();
    }
};

我的问题是专门的为什么?我检查了std ::队列,并且默认为Deque!为什么在地球上会更快,因为它是队列?我唯一的猜测是,它正在缓存该价值一些?但与此同时,默认情况下是一个排队!插入/删除时间实际上不能更好!

(旁注,我不考虑大小== 0的情况>

这是一个受过教育的猜测:

  • 内存控制器具有预取的"交手",可奖励连续的,上升的内存访问,但对于以降序的顺序访问速度较慢。

  • 因此,用作FIFO容器的Deques具有推动一侧并在另一侧弹出的首选方向。

  • 可能,您的Deque代码使用最不喜欢的方向。但是,已经对队列实现进行了优化,以最喜欢的方向使用基础deque。

  • 有一种简单的方法来检验这一假设(鉴于这些是非保证的实施细节)。在您的Deque代码中,切换push_back --> push_frontpop_front --> pop_back。如果假设是正确的,则Deque代码应加速与队列实现一样快: - )