私はstd::deque
を使用しています。 push_back
と1つのinsert
のループを置き換えると、パフォーマンスが向上すると確信していました。また、例えばhereのように推奨されます。挿入よりもPush_backが速いですか?
しかし、私はもはやこれ以上は分かりません。
テストコードでベンチマークを実行しました。
MAIN.CPP:
#include"queueInsert.h"
#include<Windows.h>
std::deque<int> queue;
constexpr size_t len = 64;
int arr[len];
int main()
{
DWORD startTime = GetTickCount();
for (int i = 0; i < 100000; ++i)
{
insert(queue, arr, len);
}
DWORD endTime = GetTickCount();
return endTime - startTime;
}
queueInsert.h:
#include<deque>
void insert(std::deque<int>&, int* arr, int n);
queueInsert.cpp -pushバージョン
#include "queueInsert.h"
void insert(std::deque<int>& queue, int* arr, int n)
{
for (int i = 0; i < n; ++i)
{
queue.push_back(arr[i]);
}
}
queueInsert.cpp -insertバージョン
#include "queueInsert.h"
void insert(std::deque<int>& queue, int* arr, int n)
{
queue.insert(queue.end(), arr, arr + n);
}
push_back
では203
ミリ秒ですが、218
ではinsert
となります。 219
push
のための工場やinsert
ため266
:
、6
にlen
を変更し、1百万回の反復を増やすには、同じ結果を保持します。のみlen = 640
と
はpush
は非常に少ないことで、その後も負ける、とん:insert
ため1437
に対するpush
ため1531
を。
私は、コンパイラは私が変更するたびとして、反復の一定の数をインライン化やループを融合としての最適化を行っていません確信しているWindowsの10
下VisualStudioを2015年にリリースしてコンパイルしています実装はqueueInsert.cpp
のみが再コンパイルされます。
プロファイリングが間違っていますか?または、挿入する要素の量が大きくない可能性がある場合は、実際にはpush_back
を保持する必要がありますか?
*コンパイラが最適化していないと確信しています* - アセンブリリストを見てみましょう。 – PaulMcKenzie
私は元の記事、nevermindを読んでいます – Slava
私はvectorを 'std :: vector'ではなく要素のシーケンスとして意味しました。意味を明確にするように修正しました。 –