我知道 C 风格的数组或 std::array
并不比向量更快。我一直在使用向量(而且我使用它们很好)。然而,有些情况下,使用 std::array
比 std::vector
更好,并且我不知道为什么(使用 clang 7.0 和 gcc 8.2 进行测试)。
让我分享一个简单的代码:
#include <vector>
#include <array>
// some size constant
const size_t N = 100;
// some vectors and arrays
using vec = std::vector<double>;
using arr = std::array<double,3>;
// arrays are constructed faster here due to known size, but it is irrelevant
const vec v1 {1.0,-1.0,1.0};
const vec v2 {1.0,2.0,1.0};
const arr a1 {1.0,-1.0,1.0};
const arr a2 {1.0,2.0,1.0};
// vector to store combinations of vectors or arrays
std::vector<double> glob(N,0.0);
上述初始化变量的代码未包含在基准测试中。现在,让我们编写一个函数来组合
v1
和v2
或a1
和a2
的元素(double
)。// some combination
auto comb(const double m, const double f)
{
return m + f;
}
还有基准函数:
void assemble_vec()
{
for (size_t i=0; i<N-2; ++i)
{
glob[i] += comb(v1[0],v2[0]);
glob[i+1] += comb(v1[1],v2[1]);
glob[i+2] += comb(v1[2],v2[2]);
}
}
void assemble_arr()
{
for (size_t i=0; i<N-2; ++i)
{
glob[i] += comb(a1[0],a2[0]);
glob[i+1] += comb(a1[1],a2[1]);
glob[i+2] += comb(a1[2],a2[2]);
}
}
我已经尝试过使用clang 7.0和gcc 8.2。在两种情况下,数组版本的速度几乎是向量版本的两倍。
有人知道为什么吗?
a1
和a2
是常量。编译器在编译时计算它们的总和。不幸的是,gcc和clang并不聪明到足以将comb(v1[0], v2[0])
移出循环(即使将它们的data()
放入__restrict
指针中 - 这是一个被忽略的优化)。 - geza