簡體   English   中英

Boost 圖:加速 add_edge

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM