fill_n与for循环初始化数组

时间:2012-12-17 07:02:15

标签: c++ optimization std

我想知道初始化时fill_n和for循环之间的性能差异是什么 一个数组?

哪一个更好?

3 个答案:

答案 0 :(得分:4)

刚刚测试了这三个代码(由GCC 4.7.2编译,-O3优化):

我在所有代码中添加了这两行,因为我认为如果没有它们,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

答案 1 :(得分:3)

这些方法之间没有明显的性能差异。他们实现了同样的事情。并且代码的典型复杂程度足够低,几乎任何现代编译器都能够实现同样的事情并生成基本相同的代码。

答案 2 :(得分: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