編集: 挿入を修正しました。Blastfurnace が親切に言及したように、挿入によりイテレータが無効になりました。パフォーマンスを比較するには、ループが必要だと思います (Blastfurnance の回答に関する私のコメントを参照してください)。私のコードが更新されました。ベクトルをリストに置き換えただけで、リストに完全に似たコードがあります。ただし、コードを使用すると、小さなデータ型と大きなデータ型の両方、および線形検索 (挿入を削除した場合) の両方で、リストがベクターよりも優れたパフォーマンスを発揮することがわかりました。http://java.dzone.com/articles/c-benchmark-%E2%80%93-stdvector-vsおよびその他のサイトによると、そうではありません。それがどのようになるかの手がかりはありますか?
私は数学ソフトウェアのプログラミングに関するコースを受講しています (月曜日の試験)。そのために、ベクターとリストへの要素のランダム挿入のパフォーマンスを比較するグラフを提示したいと思います。ただし、コードをテストしていると、ランダムに速度が低下します。たとえば、サイズ 500 のベクトルに 10 個の要素をランダムに挿入するのに 0.01 秒かかる 2 回の反復と、それぞれ約 12 秒かかる 3 回の同様の反復があるとします。これは私のコードです:
void AddRandomPlaceVector(vector<FillSize> &myContainer, int place) {
int i = 0;
vector<FillSize>::iterator iter = myContainer.begin();
while (iter != myContainer.end())
{
if (i == place)
{
FillSize myFill;
iter = myContainer.insert(iter, myFill);
}
else
++iter;
++i;
}
//cout << i << endl;
}
double testVector(int containerSize, int iterRand)
{
cout << endl;
cout << "Size: " << containerSize << endl << "Random inserts: " << iterRand << endl;
vector<FillSize> myContainer(containerSize);
boost::timer::auto_cpu_timer tid;
for (int i = 0; i != iterRand; i++)
{
double randNumber = (int)(myContainer.size()*((double)rand()/RAND_MAX));
AddRandomPlaceVector(myContainer, randNumber);
}
double wallTime = tid.elapsed().wall/1e9;
cout << "New size: " << myContainer.size();
return wallTime;
}
int main()
{
int testSize = 500;
int measurementIters = 20;
int numRand = 1000;
int repetionIters = 100;
ofstream tidOutput1_sum("VectorTid_8bit_sum.txt");
ofstream tidOutput2_sum("ListTid_8bit_sum.txt");
for (int i = 0; i != measurementIters; i++)
{
double time = 0;
for (int j = 0; j != repetionIters; j++) {
time += testVector((i+1)*testSize, numRand);
}
std::ostringstream strs;
strs << double(time/repetionIters);
tidOutput1_sum << ((i+1)*testSize) << "," << strs.str() << endl;
}
for (int i = 0; i != measurementIters; i++)
{
double time = 0;
for (int j = 0; j != repetionIters; j++) {
time += testList((i+1)*testSize, numRand);
}
std::ostringstream strs;
strs << double(time/repetionIters);
tidOutput2_sum << ((i+1)*testSize) << "," << strs.str() << endl;
}
return 0;
}
struct FillSize
{
double fill1;
};
構造体は、さまざまなサイズの要素をテストできるように、値を簡単に追加するためのものです。パフォーマンス テストに関しては、このコードがおそらく完全ではないことはわかっていますが、私が見つけたものを参照するだけでなく、簡単な例を作成することを望んでいます。
このコードを 2 台のコンピューターでテストしましたが、どちらも同じ問題を抱えています。それはどうしてですか?そして、それをグラフ化して月曜日に提示できるように、修正を手伝ってもらえますか? おそらく、各反復の間に数秒の待機時間を追加すると役立つでしょうか?
敬具、ビャルケ