c++,类,向量,优化:多个独立向量vs一个类向量



假设我有多种不同数据类型的向量:

vector <double> someNumbers;
vector <int> someMoreNumbers;
vector <string> someStrings;
int main(){
    for(...){
        someNumbers[i];
        someMoreNumbers[i];
        someStrings[i];
    }
}

如果我将所有这些数据放入一个类中,而使用一个类向量来访问它们,那么效率会更高、更低还是同样高?

class vectors{
    double aNumber;
    int anotherNumber;
    string aString;
}
int main(){
    for(...){
        vectors[i].aNumber;
        vectors[i].anotherNumber;
        vectors[i].aString;
    }
}

从类中访问相同的数据是否会带来某种额外的开销?整体效率是否取决于我的向量的大小(在我的情况下,每个向量包含15000个项目)?

IMHO,第二个版本会更高效,因为您的数据是连续存储的,因此可以更好地利用缓存,而在第一个版本中,您的数据分为三个不同的向量。

然而,在任何情况下,您都必须对这两个版本进行基准测试,以找出最有效的版本。

整体效率是否取决于矢量的大小(在每个向量包含15000个项目的情况)?

是的,这两种方法之间的效率差异肯定取决于总规模。大部分性能差异将是由于缓存未命中造成的。当处理的数据量比您描述的要大得多时,通常情况下,总体性能的大部分都会被缓存未命中所支配,因此正确处理细节非常重要。

但是15000是很小的。因此,二级缓存未命中(通常是非常重要的)并不那么重要。对于索引序列中的一些随机模式(引用代码中的i),再加上对每个i使用所有三个项,结构向量的一级缓存未命中次数会更少,从而转化为显著更好的性能。

但更有可能的是,您会有一种访问模式,在这种模式中,来自对齐浪费的缓存污染会导致比相关元素的关联所节省的更多的缓存未命中。因此,在15000左右的大小下,我预测单独的矢量会更快。

但真正的底线是15000很小,因此结构中元素的逻辑关联在代码可读性方面比在性能方面可能的微不足道的损失更有好处。

如果我将所有这些数据放入一个类中,而使用1个类向量,那么效率会更高、更低还是同样高?

如果使用structs的vector,则所需内存很可能会更大,因为sizeof(int) + sizeof(double) + sizeof(std::string)将严格小于sizeof(vectors)

然而,在选择一种方法与其他方法时,还必须考虑其他因素。我可以想到两个这样的因素:代码可读性和可维护性,运行时性能。如果将数据放入struct/class中,代码将更易于阅读和维护。很难说这两种方法之间的运行时间差异。我怀疑他们不会有太大的不同。

最新更新