[英]Boost graph: speeding up add_edge
我有一個boost
graph 應用程序,我需要調用 function add_edge( ) [documentation available here] 。
使用KCachegrind
分析這個應用程序揭示了以下花費的時間分解:
可以看出, add_edge
function 調用占用了父調用者大約 21% 的時間。 在這 21% 中,14.49% 只是一些std::vector
的重新分配。
防止此類向量重新分配的建議方法似乎是預先reserve
一些空間。 參見例如線程: How to prevent memory relocation using std::vector
在升壓圖中保留一些足夠空間的等效方法是什么?
因此,在其上重復調用add_edge
的基礎圖 object 是:
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
沒有 function reserve
。
編輯以添加指向最小示例的鏈接(很難完全工作),但編譯良好,除了不是主要問題的未定義外部引用。
對我來說不幸的是,g.m_edges 沒有 function 保留
但是m_vertices
可以。
#include <boost/graph/adjacency_list.hpp>
int main() {
boost::adjacency_list<> g;
g.m_vertices.reserve(1024);
}
此外,由於您使用的是vecS
,您幾乎可以等效地使用預先分配的頂點數進行構造:
boost::adjacency_list<> g(1024);
當然,不同之處在於,這不僅為圖形保留空間,而且還調整了圖形的大小以包含 1024 個頂點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.