我有一个boost
图形应用程序,我需要在其中调用函数 add_edge() [此处提供的文档]。
分析此应用程序KCachegrind
揭示了以下所用时间的分解:
可以看出,add_edge
函数调用占用了父调用者大约 21% 的时间。在这 21% 中,14.49% 只是一些std::vector
人的重新分配。
防止此类向量重新分配的建议方法似乎是预先reserve
预留一些空间。参见例如线程:如何使用 std::vector 防止内存重新分配
在升压图中保留一些足够空间的等效方法是什么?
因此,对其进行重复调用的底层图形对象add_edge
是:
typedef adjacency_list<
vecS, vecS, directedS,
property<
vertex_name_t, std::string,
property<vertex_index_t, int,
property<vertex_color_t, boost::default_color_type,
property<vertex_distance_t, double,
property<vertex_predecessor_t, Traits::edge_descriptor>
> > > >,
property<
edge_index_t, int,
property<edge_capacity_t, double,
property<edge_weight_t, double,
property<edge_residual_capacity_t, double,
property<edge_reverse_t, Traits::edge_descriptor>
> > > > >
Graph;
对我来说不幸的是,g.m_edges
没有功能reserve
。
编辑以添加指向最小示例的链接(很难完全工作),但编译良好,除了不是主要问题的未定义外部引用。