假设我有多种不同数据类型的向量:
vector <double> someNumbers;
vector <int> someMoreNumbers;
vector <string> someStrings;
int main(){
for(...){
someNumbers[i];
someMoreNumbers[i];
someStrings[i];
}
}
如果我将所有这些数据放入一个类而不是使用1个类向量来访问它们,会更多,更少或同等效率吗?
class vectors{
double aNumber;
int anotherNumber;
string aString;
}
int main(){
for(...){
vectors[i].aNumber;
vectors[i].anotherNumber;
vectors[i].aString;
}
}
从类中访问相同的数据是否会产生某种额外的开销?整体效率是否取决于我的向量的大小(在我的情况下,每个向量包含15,000个项目)?
答案 0 :(得分:1)
恕我直言,第二个版本会更有效率,因为你的数据是连续存储的,所以你可以更好地利用缓存,而在第一个版本中,你的数据在三个不同的向量中被分割。
但是,在任何情况下,您都必须对这两个版本进行基准测试,以找出效率最高的版本。
答案 1 :(得分:1)
整体效率是否取决于我的载体的大小(在我的 case每个向量包含15,000项)?
是的,两种方法之间的效率差异肯定取决于总体规模。大多数性能差异将归因于缓存未命中。使用比您描述的数据量大得多的数据时,大多数性能总体上都会受到缓存未命中的影响,因此正确获取该详细信息非常重要。
但是15,000很小。因此,您的L2缓存未命中(通常是非常重要的缓存)并不重要。对于索引序列中的一些随机模式(引用代码中的i
)与每个i
的所有三个项的使用相结合,结构的向量将具有更少的L1缓存未命中,转换为可测量的更好性能。
但更有可能的是,您将拥有一种访问模式,其中来自对齐浪费的缓存污染将导致更多缓存未命中,而不是相关元素的关联将节省。所以在大小如15,000的情况下,我会预测单独的向量会更快。
但真正的底线是15,000是小的,所以结构中元素的逻辑关联在代码可读性方面比在可能的性能损失方面有更多好处。
答案 2 :(得分:0)
如果我将所有这些数据放入一个类而不是使用1个类向量,它会更多,更少或同等效率吗?
如果vector
struct
使用sizeof(int) + sizeof(double) + sizeof(std::string)
,则所需的内存很可能会更大,因为sizeof(vectors)
将严格小于struct/class
。
但是,在选择一种方法与其他方法时,还有其他因素需要考虑。我可以想到两个这样的因素:代码可读性和可维护性,运行时性能。如果将数据放入{{1}},代码将更易于阅读和维护。很难说两种方法之间的运行时间差异。我怀疑他们不会有太大的不同。