큐를 사용하는 코드의 예상치 못한 성능 문제가 발생했습니다. 큐에 더 많은 요소가있을 때 성능이 저하된다는 것을 알게되었습니다. size()
방법의 사용이 이유였습니다. 여기에 문제를 보여 일부 코드는 다음과 같습니다 CStopwatch
는 clock_gettime(CLOCK_REALTIME, ..)
를 사용하는 클래스가std :: queue <T, list<T> :: size()가 O (n)에서 느립니다?
#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;
}
. 결과는 다음과 같습니다
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/ 모순 보인다
복잡성 : 정수입니다.
구조체가 더 커지면 문제가 더 심해집니다. 나는 GCC 4.3.2를 사용하고있다.
설명 할 수 있습니까? 목록을 사용하여이를 해결할 수있는 방법이 있습니까?
(. 내가 일정 시간 삽입 복잡성을 필요로하기 때문에 큐의 기본 컨테이너로 목록을 사용할 필요가 있습니다)
cplusplus.com는 오류가 없습니다. –
@ BjörnPollex : cppreference는 같은 것을 말합니다. 포인트는'queue'는 어댑터 클래스입니다. –
한편 목록 자체의 크기를 추적하여 얻을 수있는 컨테이너 (목록 포함)에 대한 크기 연산은 O (1)을 권장합니다. –