【发布时间】:2021-09-07 10:18:39
【问题描述】:
在 ~21K 变量 (iNumVars ~21K) 的 for 循环中,我有以下代码 sn-p 其中 iNumVars 和 vars 都是整数,并且 vars 在大多数情况下为零(被忽略)并且在其他(有额外处理的):
for (i=1; i<=iNumVars; i++) {
if (vars[i]) {
... additional processing ...
在大约 21K 变量中,有 10 - 150 个是感兴趣的。在完成这项任务的另一种方式中,我可以使用 Boost Graph Library 并将 ~21K 变量标识为图中的顶点(变量名称 G)。过滤图 G 以识别 10 - 150 个感兴趣的变量,然后可以使用以下方法对其进行迭代:
auto vpair = vertices(filteredG);
for (auto iter=vpair.first; iter!=vpair.second; iter++) {
... the same additional processing as above ...
for 循环被调用了 1000 万次。我发现迭代数量少得多的顶点比迭代所有变量并仅进行布尔比较花费更长的时间。我不是快速 C++ 编码方面的专家,但这有意义吗? Boost Graph Library 迭代器真的会减慢 for 循环吗?
需要注意的是,我没有展示图表 G 如何到达过滤后的版本 filtersG。但是,在任何情况下,出于其他原因,在上述行中的任何一个 for 循环中都会这样做,因此必须执行 10M 次 filter_graph 操作没有额外的时间损失。
谢谢, 吉姆
【问题讨论】:
-
"for 循环被调用了 1000 万次。"每次调用时,非零变量是否相同?
-
不熟悉 Boost Graph 库,但作为建议,如果需要,我会将这 150 个项目存储在一个单独的向量中,其中仅包含感兴趣的对象及其对应的索引
vector<pair<object, index>> -
然而值得注意的是
Graphs 通常不用于过滤事物。它们通常用于查找对象之间的关系,例如Travelling salesman problem -
@Ranoiaetep 他们没有使用图表来过滤事物:他们正在过滤图表。
-
@sehe 他说以另一种方式来完成这项任务,我可以使用 Boost Graph Library...,这听起来像是他将数据放在向量/简单中之前的容器,但现在他将数据放入图表中只是因为 boost 有一个
filtered_graph适配器。如果是这样的话,那么我认为使用图不是一个好方法,因为图是比简单向量重得多的结构。
标签: c++ performance boost graph filtered