1

fill_n配列を初期化するときの for ループとのパフォーマンスの違いは何ですか?

どちらの方がよいですか?

4

3 に答える 3

4

次の 3 つのコードをテストしました (GCC 4.7.2 で-O3最適化してコンパイル):

この 2 行をすべてのコードに追加しました。これがないと、GCC オプティマイザーに騙されてしまうと思うからです。

for (int i = 0; i < SIZE; i++)
    arr[i] = arr[i + 1 % SIZE];

1.cpp

#define SIZE (100*1000*1000)
char arr[SIZE];

int main()
{
    for (int i = 0; i < SIZE; i++)
        arr[SIZE] = 0;

    for (int i = 0; i < SIZE; i++)
        arr[i] = arr[i + 1 % SIZE];
}

2.cpp

...
    std::fill_n(arr, SIZE, 0);
...

3.cpp

...
    memset(arr, 0, SIZE);
...

測定時間:

mostafa@debian:~/Codes/tests/x$ time ./1
real   0m0.073s
user   0m0.008s
sys    0m0.064s

mostafa@debian:~/Codes/tests/x$ time ./2
real   0m0.080s
user   0m0.020s
sys    0m0.056s

mostafa@debian:~/Codes/tests/x$ time ./3
real   0m0.100s
user   0m0.056s
sys    0m0.044s
于 2012-12-17T07:11:27.953 に答える
3

これらのアプローチ間に有意なパフォーマンスの違いはありません。彼らは同じことを実装しています。そして、典型的なコードの複雑さのレベルは、事実上すべての最新のコンパイラーが同じことを行い、本質的に同じコードを生成することを認識するのに十分なほど低いものです。

于 2012-12-17T07:23:35.443 に答える
0

cppreference.com による実装:

template<class OutputIt, class Size, class T>
OutputIt fill_n(OutputIt first, Size count, const T& value)
{
    for (Size i = 0; i < count; i++) {
        *first++ = value;
    }
    return first;
}

これであなたの質問に答えられると思いますか?:P

于 2012-12-17T07:11:28.833 に答える