【发布时间】:2015-07-23 22:47:23
【问题描述】:
如何提高 std::vector 时间? 嗨,我正在为多变量模糊 k 表示集群制作软件。 它通过 10 个变量处理大矩阵的 50.000 个观察值。 矩阵不需要长大或缩小或边界检查。 仅将大小调整为所需大小,加载项目,然后进行大量访问。
第一次使用:
`std::vector< std::vector<double> > matrix(NumClusters, std::vector<double>(NumObs,0.0));`
获取元素:double A=matrix[i][j];但是处理时间是20分钟。
然后制作:
std::vector<double> U(NumClusters *NumObs,0.0);
获取元素:double A=U[i*NumObs+j];而且时间更好。
现在想提出一个问题: 哪个会更快获得访问权限:
迭代器+整数
std::vector<double>::const_iterator Uit = U.begin();
double A= *(Uit+index)
指针[int]
std::vector<double>::const_pointer Upt = U.data();
double A= Upt[index];
或者普通的索引访问[int]
双 A= U[索引];
问候
【问题讨论】:
-
matrix[i][j]你的问题是数据的局部性。你为什么不测试其他两个选项?在您的示例中,我更喜欢索引,因为迭代器没有为您做任何事情并且 更难 阅读。 -
所有编译器都应该将 operator[] 内联到对指针的直接访问中,因此您无法获得比这更快的任何东西。也许你的瓶颈在别的地方
-
应该是一样的。编译器最终应该对索引或指针访问做同样的事情。
-
分析你的代码,而不是做出毫无结果的假设
-
分析您的代码。在通过迭代器或
operator[]进行调试构建访问时,由于某些编译器执行完整性检查,很可能会更慢,但在发布构建中,我希望所有方法的时间几乎相同。