【发布时间】:2014-12-15 09:28:34
【问题描述】:
我想在我的程序中用std::array 替换std::vector,所以我继续测试:
template<typename T> class A{
public:
void sub_run(T w){
w[0] = 0.5;
w[1] = 1.5;
w[2] = 2.5;
w[3] = 0.0;
for (int i = 0; i < 100000000; i++)
{
w[0] = i *0.5;
w[1] = i *1.5;
w[2] = i *2.5;
w[3] = w[0] + w[1]*w[2];
}
}
};
int main(){
// Vectors
/*
A<vector<double> > inst_a;
vector<double> w(4);
inst_a.sub_run(w);
*/
// 1.71 sec
// C-array
/*
A<double *> inst_a;
double w[4];
inst_a.sub_run(w);
*/
// 1.03 sec
// std::array
A<array<double,4> > inst_a;
array<double,4> w;
inst_a.sub_run(w);
// 3.31 sec
return 0;
}
好吧,输出很奇怪 - std::array 比 C 数组慢 3 倍,甚至比 vector 慢。没有应用优化,唯一的标志是-std=c++11。
有什么问题?
【问题讨论】:
-
没有应用优化,唯一的标志是 -std=c++11。有什么问题?。您是否检查了何时应用优化?未优化的 C++ 不会试图以任何形式或形式击败“类 C”的性能,所以如果你要谈论最终产品的性能,你必须让 C++ 编译器有优化的余地……因为否则,它会留下很多有助于调试/等的东西。比较不公平。
-
“未应用优化”正是问题所在。
-
""未应用优化"正是问题所在。" - 这在某种程度上是不明显的,因为 cppreference.com 只是说“......将 C 样式数组的性能和可访问性与标准容器的优点相结合,例如知道自己的大小、支持分配、随机访问迭代器等”
-
@stkubr 从文档中可能不明显, 但这是常识。他们不会每次都重复这个。这类似于警告某人每次执行积分时“不要忘记积分常数”。