5

新しい chrono ライブラリ (C++11) を見て、それを使用しようとしていました。以下の 2 つのプログラムを作成しました。

ベクトル.cpp

#include <iostream>
#include <vector>
#include <chrono>

int main()
{
    std::vector<double> vector(1000000, 0.);

    auto start = std::chrono::high_resolution_clock::now();
    for(int i(0); i < vector.size(); i++)
    {
        vector[i] += 1.;
    }
    auto end = std::chrono::high_resolution_clock::now();

    std::cout << "Elapsed time: " << std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count() << " milliseconds" << std::endl;

    return 0;
}

配列.cpp

#include <iostream>
#include <array>
#include <algorithm>
#include <chrono>

int main()
{
    std::array<double, 1000000> array;

    std::fill(array.begin(), array.end(), 0.);

    auto start = std::chrono::high_resolution_clock::now();
    for(int i(0); i < array.size(); i++)
    {
        array[i] += 1.;
    }
    auto end = std::chrono::high_resolution_clock::now();

    std::cout << "Elapsed time: " << std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count() << " milliseconds" << std::endl;

    return 0;
}

配列プログラムで9ミリ秒、ベクトルプログラムで12ミリ秒を取得しました。std::vector は、std::array よりも約 33% 遅いようです。私はそれを正しくやっていますか?この違いはなぜですか?

Ps: GCC 4.7、Mac OS X 10.7 を使用しています。

g++-mp-4.7 -std=c++11 vector.cpp -o vector
g++-mp-4.7 -std=c++11 array.cpp -o array
4

3 に答える 3

9

コードを次のように変更しました。

std::array<double, 1000000> array;

double total = 0;
std::fill(array.begin(), array.end(), 0.);

for (unsigned j = 0; j < 1000; ++j)
{
    auto start = std::chrono::high_resolution_clock::now();

    for (unsigned i = 0; i < array.size(); i++)
    {
        array[i] += 1.;
    }

    auto end = std::chrono::high_resolution_clock::now();
    total = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
}

std::cout << total << " for Array." << std::endl;

std::vector<double> vector(1000000, 0.);
total = 0;

for (unsigned j = 0; j < 1000; ++j)
{
    auto start = std::chrono::high_resolution_clock::now();

    for (unsigned i = 0; i < vector.size(); i++)
    {
        vector[i] += 1.;
    }

    auto end = std::chrono::high_resolution_clock::now();
    total = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
}

std::cout << total << " for Vector." << std::endl;

を使用した私の結果-O3

8123 for Array.
8117 for Vector.

どちらも同じように速いようです。

于 2012-08-25T10:38:38.587 に答える
2

数値は、最適化を有効にしないと意味がありません。ほとんどの場合、 size() を繰り返し呼び出すと、ケースに違いが生じます。

于 2012-08-25T10:38:59.950 に答える
1

Astd::arrayのサイズはコンパイル時にわかっているため、メモリはスタックに割り当てられる可能性が高くなります。

Astd::vectorは使用しますstd::allocator(これはおそらく `new を使用して、実行時にフリー ストア (別名ヒープ) からメモリを割り当てます)。

ヒープとスタックの割り当てでは、30% が正常だと思います。


編集: liveworkspace.org (std::vectorおよびstd::array) でこれを数回実行すると (最も科学的な測定ではありません)、8 対 10 ミリ秒が得られます。実際、すべての割り当てが測定範囲外であるため、ヒープへのアクセスはスタック メモリへのアクセスよりも遅いと単純に結論付けます。ヒープの場合には余分な間接性があるため、これが一般的に正しいとしても驚かないでしょう。

于 2012-08-25T10:15:51.730 に答える