簡體   English   中英

c ++,類,向量,優化:多個獨立向量與1個類向量

[英]c++, classes, vectors, optimization: multiple independent vectors vs 1 vector of classes

說我有多種數據類型的多個向量:

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個項)?

恕我直言,第二個版本會更有效,因為由於數據是連續存儲的,因此可以更好地利用緩存,而在第一個版本中,數據則分為三個不同的向量。

但是,無論如何,您都必須對這兩個版本進行基准測試以找出最有效的版本。

整體效率是否取決於矢量的大小(在我的情況下,每個矢量包含15,000個項)?

是的,兩種方法之間的效率差異肯定取決於總大小。 大多數性能差異將歸因於緩存未命中。 當處理的數據量比您所描述的大得多時,通常大多數性能都會受緩存未命中的支配,因此正確獲取詳細信息確實很重要。

但是15,000很小。 因此,您的L2緩存未命中(通常是非常重要的未命中)並不是那么重要。 對於索引序列中的一些隨機模式( i在你的報價代碼)結合使用的所有三個項目的每一個i ,結構的載體將有較少的L1高速緩存未命中,翻譯成可測量更好的性能。

但是更有可能的是,您將擁有一種訪問模式,其中對齊廢物造成的緩存污染將導致緩存未命中,而相關元素的關聯將節省更多的緩存。 因此,在15,000的大小下,我預計單獨的向量將變得更快。

但是真正的底線是15,000很小,因此結構中元素的邏輯關聯在代碼可讀性方面比在性能上可能造成的輕微損失更多。

如果我將所有這些數據放到一個類中,而是使用1個類的矢量,效率會更高,更低或同等?

如果使用struct s vector ,則所需的內存很可能會更大,因為sizeof(int) + sizeof(double) + sizeof(std::string)將嚴格小於sizeof(vectors)

但是,選擇一種方法與其他方法時,還必須考慮其他因素。 我可以想到兩個這樣的因素:代碼的可讀性和可維護性,運行時性能。 如果將數據放入struct/class ,則代碼將更易於閱讀和維護。 很難說兩種方法之間的運行時差異。 我懷疑它們不會有太大不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM