1

編集: 挿入を修正しました。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 台のコンピューターでテストしましたが、どちらも同じ問題を抱えています。それはどうしてですか?そして、それをグラフ化して月曜日に提示できるように、修正を手伝ってもらえますか? おそらく、各反復の間に数秒の待機時間を追加すると役立つでしょうか?

敬具、ビャルケ

4

1 に答える 1

1

あなたのAddRandomPlaceVector機能には重大な欠陥があります。を使用insert()するとイテレータが無効になるため、forループは無効なコードになります。

目的の挿入ポイントがわかっている場合は、繰り返し処理する理由はまったくありませんvector

void AddRandomPlaceVector(vector<FillSize> &myContainer, int place)
{
    FillSize myFill;
    myContainer.insert(myContainer.begin() + place, myFill);
}
于 2013-12-14T12:12:10.047 に答える