2013-08-28 193 views
0

我有一組約150個變量,可以有不同的類型(double,bool,array)。我需要將這組變量包裝到QVector中。由於類型變量的不同,我想使用QVariant。到目前爲止,這是我的設計。我不確定的是myVariables的性能+搜索機制。QVector結構 - 性能+最佳實踐

enum class VariableEnums{ 
    VAR1, 
    VAR2, 
    VAR3 
}; 

struct myVariable{ 
    VariableEnums var; 
    QVariant value; 
}; 

QVector<myVariable> myVariables; 

這個想法是myVariables將被髮送到幾個模塊。每個模塊都會找到一個特定的變量並更新其他一些變量。所以一個模塊可以更新將被另一個模塊使用的變量。到目前爲止,關於搜索我能想到的一個特定的變量只有以下幾點:

foreach(myVariable *myVar, myVariables{ 
    if(myVar->var == VariableEnums::VAR1){ 
    //...... 
    continue; 
    } 
} 

有沒有做一些這方面的更有效的方法?我可以使用indexOf,但我不確定如何將它與結構一起使用。

謝謝, m。

+0

你剖析它。這樣你就可以在你的系統上知道這個選擇的性能。是否也可以選擇構建'QVector ','QVector '...,並根據需要傳遞它們。看起來你的代碼正在遭受失憶,因爲你知道這種類型,然後忘了它。 – andre

+0

您是否將不同的類型與VAR1到VAR3中的每一個關聯?如果是這樣,爲什麼不簡單地保留三個單獨的值列表並且僅對特定類別的值進行工作?這不僅可以讓您搜索異構容器,還可以消除QVariant的運行時間開銷。當然,除非你絕對需要單一的異構容器。 – thokra

回答

0

做了一些分析後,結果證明帶有枚舉結構的QVector是最快的組合。 QVector

我已經試過QHash,QMAP和數據持有人的QString和的QVariant

基準:

...searching in dataset size: 1090000 
testing < QVector<struct enum> > case time (ms): 242 
testing < QVector<struct QString> > case time (ms): 1220 
testing < QMap<enum, QVariant> > case time (ms): 3458 
testing < QHash<enum, QVariant> > case time (ms): 2167 
0

你可以考慮使用multimap而不是QVector。隨着多重映射可以映射你的變量,如:

原油表示:

{ 
    VAR1, a 
    VAR1, b 
    VAR2, c 
    VAR1, d 
    VAR3, e 
    etc... 
} 

然後你可以使用多重映射:: equal_range()函數來獲取一組具有相同的「鍵」的變量,例如變量與關鍵「VAR1」。

我不確定是否有QMultimap,但有一個QMap我還沒有看過。但如果不是隻使用標準的C++ multimap。

+0

據我所知,從性能的角度來看,QVector比QMap更快,所以我想更多關於QVector – miro

+0

@MiroKarpis在這種情況下,我不確定矢量的性能是否更好。 multimap存儲按'鍵'排序的元素。因此,當需要使用'equal_range()'函數提取元素時,它可以非常快速地執行(如果有許多結果可以更快地找到矢量)。然而,向量可能會更快地添加/刪除元素或通過索引訪問單個元素......這取決於您希望將性能優化到哪裏......對我來說,看起來您希望優化以快速獲得結果:) –