事前に割り当てられた配列を使用するスタックの「自家製」バージョンと比較すると、標準の std deque が非常に遅いことがわかりました。
これは私のスタックのコードです:
template <class T>
class FastStack
{
public:
T* st;
int allocationSize;
int lastIndex;
public:
FastStack(int stackSize);
FastStack();
~FastStack();
inline void resize(int newSize);
inline void push(T x);
inline void pop();
inline T getAndRemove();
inline T getLast();
inline void clear();
};
template <class T>
FastStack<T>::FastStack()
{
lastIndex = -1;
st = NULL;
}
template <class T>
FastStack<T>::FastStack(int stackSize)
{
st = NULL;
this->allocationSize = stackSize;
st = new T[stackSize];
lastIndex = -1;
}
template <class T>
FastStack<T>::~FastStack()
{
delete [] st;
}
template <class T>
void FastStack<T>::clear()
{
lastIndex = -1;
}
template <class T>
T FastStack<T>::getLast()
{
return st[lastIndex];
}
template <class T>
T FastStack<T>::getAndRemove()
{
return st[lastIndex--];
}
template <class T>
void FastStack<T>::pop()
{
--lastIndex;
}
template <class T>
void FastStack<T>::push(T x)
{
st[++lastIndex] = x;
}
template <class T>
void FastStack<T>::resize(int newSize)
{
if (st != NULL)
delete [] st;
st = new T[newSize];
}
.
deque のこの簡単なベンチマークを実行します。
std::deque<int> aStack;
int x;
HRTimer timer;
timer.Start();
for (int i = 0; i < 2000000000; i++)
{
aStack.push_back(i);
x = aStack.back();
if (i % 100 == 0 && i != 0)
for (int j = 0; j < 100; j++)
aStack.pop_back();
}
double totalTime = timer.Stop();
stringstream ss;
ss << "std::deque " << totalTime;
log(ss.str());
.
ベクトルをコンテナーとして std スタックを使用する (「Michael Kohne」が提案したように)
std::stack<int, std::vector<int>> bStack;
int x;
HRTimer timer;
timer.Start();
for (int i = 0; i < 2000000000; i++)
{
bStack.push(i);
x = bStack.top();
if (i % 100 == 0 && i != 0)
for (int j = 0; j < 100; j++)
bStack.pop();
}
double totalTime = timer.Stop();
stringstream ss;
ss << "std::stack " << totalTime;
log(ss.str());
.
そして、私の FastStack と同じもの:
FastStack<int> fstack(200);
int x;
HRTimer timer;
timer.Start();
for (int i = 0; i < 2000000000; i++)
{
fstack.push(i);
x = fstack.getLast();
if (i % 100 == 0 && i != 0)
for (int j = 0; j < 100; j++)
fstack.pop();
}
double totalTime = timer.Stop();
stringstream ss;
ss << "FastStack " << totalTime;
log(ss.str());
.
4 回実行した後の結果は次のとおりです。
deque 15.529
deque 15.3756
deque 15.429
deque 15.4778
スタック 6.19099
スタック 6.1834
スタック 6.19315
スタック 6.19841
FastStack 3.01085
FastStack 2.9934
FastStack 3.02536
FastStack 3.00937
結果は秒単位で表示され、Intel i5 3570k (デフォルト クロック) でコードを実行していました。利用可能なすべての最適化を備えた VS2010 コンパイラを使用しました。私の FastStack には多くの制限があることは知っていますが、それを使用できる状況や、素晴らしいブーストを提供できる状況はたくさんあります! (std::queue と比較して 2 倍の速度が得られる 1 つのプロジェクトで使用しました)。
だから今私の質問は:
誰もが使用しているが、誰も知らない C++ の「阻害剤」は他にありますか?
編集:私は攻撃的になりたくありません。このような未知の「高速化」を知っているかどうか知りたいだけです。