fill_n vs. for 循环初始化数组

fill_n vs. for-loop to initialize an array

提问人:Jason 提问时间:12/17/2012 最后编辑:jogojapanJason 更新时间:12/17/2012 访问量:1038

问:

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

哪个更好?

C++ 优化 标准

评论

2赞 Pubby 12/17/2012
你试过自己测试吗?此外,如果可能,请对数组使用大括号初始化。
2赞 NPE 12/17/2012
为什么想知道什么时候可以测量?
3赞 jogojapan 12/17/2012
既不能使用循环也不能使用循环来初始化数组。fill_nfor
0赞 Jason 12/17/2012
对不起这个愚蠢的问题,我问它是因为我使用窗口,时间库似乎可以精确到纳秒,所以我无法分辨区别。
0赞 Voo 12/18/2012
@Liang好吧,那应该可以回答你的问题。即使使用最准确的计时器,您也无法衡量差异。那么你为什么要关心它呢?无论如何,它都是不可衡量的。

答:

3赞 MostafaR 12/17/2012 #1

刚刚测试了这三个代码(由 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赞 MostafaR 12/17/2012
@jogojapan 是的,感谢您的帮助,我将编辑我的答案。-O0
1赞 Tobi Akinyemi 7/13/2020
我应该看 3 个时间中的哪个时间?
0赞 Kevin 12/17/2012 #2

根据 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

评论

7赞 jogojapan 12/17/2012
这不是实现是一种可能的实现。
3赞 AnT stands with Russia 12/17/2012 #3

这些方法之间没有有意义的性能差异。他们实现同样的事情。代码的典型复杂程度足够低,几乎任何现代编译器都无法意识到两者都做同样的事情并生成本质上相同的代码。