c++ - std::queue<T, list<T>>::size() 在 O(n) 中很慢?

标签 c++ performance stl queue

我在使用队列的代码中遇到了意外的性能行为。我意识到当队列中有更多元素时性能会下降。事实证明,使用 size() 方法是原因。这是一些显示问题的代码:

#include <queue>
#include <list>
#include <iostream>

#include "Stopwatch.h"

using namespace std;

struct BigStruct
{
    int x[100];
};
int main()
{
    CStopwatch queueTestSw;

    typedef BigStruct QueueElementType;
    typedef std::queue<QueueElementType, std::list<QueueElementType> > QueueType;
    //typedef std::queue<QueueElementType > QueueType; //no surprise, this queue is fast and constant
    QueueType m_queue;

    for (int i=0;i<22000;i++)
        m_queue.push(QueueElementType());
    CStopwatch sw;
    sw.Start();
    int dummy;
    while (!m_queue.empty())
    {
        //remove 1000 elements:
        for (int i=0;i<1000;i++)
        {
            m_queue.pop();
        }
        //call size() 1000 times and see how long it takes
        sw = CStopwatch();
        sw.Start();
        for (int i=0;i<1000;i++)
        {   
            if (m_queue.size() == 123456)
            {
                dummy++;
            }
        }
        std::cout << m_queue.size() << " items left. time: " << sw.GetElapsedTimeInSeconds() << std::endl;  
    }   
    return dummy;


}

其中 CStopwatch 是一个使用 clock_gettime(CLOCK_REALTIME, ..) 的类。结果是:

21000 items left. time: 1.08725
20000 items left. time: 0.968897
19000 items left. time: 0.818259
18000 items left. time: 0.71495
17000 items left. time: 0.583725
16000 items left. time: 0.497451
15000 items left. time: 0.422712
14000 items left. time: 0.352949
13000 items left. time: 0.30133
12000 items left. time: 0.227588
11000 items left. time: 0.178617
10000 items left. time: 0.124512
9000 items left. time: 0.0893425
8000 items left. time: 0.0639174
7000 items left. time: 0.0476441
6000 items left. time: 0.033177
5000 items left. time: 0.0276136
4000 items left. time: 0.022112
3000 items left. time: 0.0163013
2000 items left. time: 0.0101932
1000 items left. time: 0.00506138

这似乎与 http://www.cplusplus.com/reference/stl/queue/size/ 相矛盾:

Complexity: Constant.

如果结构更大,问题会更糟。我正在使用 GCC 4.3.2。

你能解释一下吗?有没有办法使用列表来解决这个问题?

(请注意,我需要使用列表作为队列的底层容器,因为我需要恒定的时间插入复杂度。)

最佳答案

queue 是一个容器 adaptor,因此您必须了解复杂性描述可能仅指适配器本身完成的工作(这确实是常量,即只是将调用传递给底层容器)。

例如,see this reference : size() 调用底层容器的 size() 函数。对于 list,这在 C++98/03 中的复杂度为 O(n),在 C++11 中的复杂度为 O(1)。

关于c++ - std::queue<T, list<T>>::size() 在 O(n) 中很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7808916/

相关文章:

c++ - 二叉树的层序遍历

c++ - 如何在 PyQt 上使用 Qxt 库?

C++在循环中插入更多 "\t"

c++ - 如何在不与标准库运算符冲突的情况下为一组相关类模板重载运算符?

performance - Haskell/GHC 内存了多少?

ruby-on-rails - ActiveRecord 模型测试的性能

mysql 日期时间性能

c++ - 我正在使用未定义 SDL_main 的 SDL 函数。这样好吗?

C++ STL 堆栈弹出操作给出段错误

c++ - 如何跟踪整数变化 vector 的中位数?