带结构的 QVector - 性能 + 最佳实践
Posted
技术标签:
【中文标题】带结构的 QVector - 性能 + 最佳实践【英文标题】:QVector with struct - performance + best practise 【发布时间】:2013-08-28 14:33:16 【问题描述】:我有一组大约 150 个变量,它们可以有不同的类型(双精度、布尔值、数组)。我需要将这组变量打包到 QVector 中。由于类型变量不同,我想到了使用 QVariant。到目前为止,这是我的设计。我不确定的是 myVariables 的性能 + 搜索机制。
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,但我不确定如何将它与结构一起使用。
谢谢, 米。
【问题讨论】:
您必须对其进行分析。这样,您将了解此选择在您的系统上的性能。是否也是构造QVector<bool>
、QVector<double>
、...并根据需要传递它们的选项。您的代码似乎患有健忘症,因为您知道类型然后忘记了它。
您是否将不同的类型与 VAR1 到 VAR3 中的每一个相关联?如果是这样,为什么不简单地保留三个单独的值列表并且只对特定类别中的值起作用?这不仅可以避免您搜索异构容器,还可以消除 QVariant 的运行时开销。当然,除非你绝对需要一个异构容器。
【参考方案1】:
在进行了一些分析后,发现带有枚举结构的 QVector 是最快的组合。 Q向量
我已经尝试过 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
【讨论】:
【参考方案2】:您可以考虑使用多图而不是 QVector。使用 multimap,您可以映射变量,例如:
粗略表示:
VAR1, a
VAR1, b
VAR2, c
VAR1, d
VAR3, e
etc...
然后您可以使用 multimap::equal_range() 函数来获取一组具有相同“键”的变量,例如带有键“VAR1”的变量。
我不确定是否有 QMultimap,但肯定有一个我没有看过的 QMap。但如果不只是使用标准的 c++ 多图。
【讨论】:
据我所知,从性能的角度来看,QVector 比 QMap 快,所以我更多地考虑 QVector @MiroKarpis 在这种情况下,我不确定向量的性能是否更好。多图存储按“键”排序的元素。因此,当它需要使用“equal_range()”函数提取元素时,它可以非常快地完成(如果要找到很多结果,则比向量更快)。但是,对于添加/删除元素或按索引访问单个元素,vector 可能更快……这取决于您希望在哪里优化性能……对我来说,您似乎想要优化以快速获得结果:)以上是关于带结构的 QVector - 性能 + 最佳实践的主要内容,如果未能解决你的问题,请参考以下文章