std::fill(v.begin(), v.end(), 0);
当您询问最快时,一如既往:测量!使用上述方法(在 Mac 上使用 Clang):
Method | executable size | Time Taken (in sec) |
| -O0 | -O3 | -O0 | -O3 |
------------|---------|---------|-----------|----------|
1. memset | 17 kB | 8.6 kB | 0.125 | 0.124 |
2. fill | 19 kB | 8.6 kB | 13.4 | 0.124 |
3. manual | 19 kB | 8.6 kB | 14.5 | 0.124 |
4. assign | 24 kB | 9.0 kB | 1.9 | 0.591 |
在 10000 个整数的向量上使用 100000 次迭代。
编辑:如果更改此数字可能会更改结果时间,则您可以确信人工基准尚未完全优化(不如检查最终汇编代码好)。当然,最好在真实条件下弄乱性能。结束编辑
供参考使用的代码:
#include <vector>
#define TEST_METHOD 1
const size_t TEST_ITERATIONS = 100000;
const size_t TEST_ARRAY_SIZE = 10000;
int main(int argc, char** argv) {
std::vector<int> v(TEST_ARRAY_SIZE, 0);
for(size_t i = 0; i < TEST_ITERATIONS; ++i) {
#if TEST_METHOD == 1
memset(&v[0], 0, v.size() * sizeof v[0]);
#elif TEST_METHOD == 2
std::fill(v.begin(), v.end(), 0);
#elif TEST_METHOD == 3
for (std::vector<int>::iterator it=v.begin(), end=v.end(); it!=end; ++it) {
*it = 0;
}
#elif TEST_METHOD == 4
v.assign(v.size(),0);
#endif
}
return EXIT_SUCCESS;
}
结论:使用std::fill
(因为正如其他人所说的最惯用的)!
assign
速度较慢,除了 { 8}。代码 coliru/paste
fill
看起来很糟糕。在这个测试中它慢了 两个数量级。
assign
成员函数怎么样?
some_vector.assign(some_vector.size(), 0);
如果它只是一个整数向量,我会先尝试:
memset(&my_vector[0], 0, my_vector.size() * sizeof my_vector[0]);
它不是很 C++,所以我相信有人会提供正确的方法来做到这一点。 :)
::std::fill
方法扩展为非常快的东西,虽然在代码方面有点臃肿,因为它都是内联的。不过我仍然会使用它,因为它更易于阅读。
尝试
std::fill
并且
std::size siz = vec.size();
//no memory allocating
vec.resize(0);
vec.resize(siz, 0);
vec.resize(0); vec.resize(siz);
进行了计时,发现使用 -O3 它的性能与 memset 相同。
我有同样的问题,但关于相当短的 vector<bool>
(afaik 标准允许在内部以不同的方式实现它,而不仅仅是一个连续的布尔元素数组)。因此,我重复了 Fabio Fracassi 稍作修改的测试。结果如下(次,以秒为单位):
-O0 -O3
-------- --------
memset 0.666 1.045
fill 19.357 1.066
iterator 67.368 1.043
assign 17.975 0.530
for i 22.610 1.004
因此,显然对于这些尺寸,vector<bool>::assign()
更快。用于测试的代码:
#include <vector>
#include <cstring>
#include <cstdlib>
#define TEST_METHOD 5
const size_t TEST_ITERATIONS = 34359738;
const size_t TEST_ARRAY_SIZE = 200;
using namespace std;
int main(int argc, char** argv) {
std::vector<int> v(TEST_ARRAY_SIZE, 0);
for(size_t i = 0; i < TEST_ITERATIONS; ++i) {
#if TEST_METHOD == 1
memset(&v[0], false, v.size() * sizeof v[0]);
#elif TEST_METHOD == 2
std::fill(v.begin(), v.end(), false);
#elif TEST_METHOD == 3
for (std::vector<int>::iterator it=v.begin(), end=v.end(); it!=end; ++it) {
*it = 0;
}
#elif TEST_METHOD == 4
v.assign(v.size(),false);
#elif TEST_METHOD == 5
for (size_t i = 0; i < TEST_ARRAY_SIZE; i++) {
v[i] = false;
}
#endif
}
return EXIT_SUCCESS;
}
我在 Ubuntu 17.10 上使用了 GCC 7.2.0 编译器。编译命令行:
g++ -std=c++11 -O0 main.cpp
g++ -std=c++11 -O3 main.cpp
v = std::vector<int>(vec_size,0)
) 似乎比fill
稍快assign
更惯用。