2016-05-06 17 views
2

gcc 3.4.5が全社で使用されているので、rtreeのboost 1.59がコンパイルに問題があるため、rtreeを1.57にする必要があります。 私だけの方法以下でRTREEを使用します。私の使用例ではboost :: rtreeはgccコンパイラの影響を大きく受けます

namespace bg = boost::geometry; 
namespace bgi = boost::geometry::index; 

typedef bg::model::point<double, 2, bg::cs::cartesian> point; 
typedef bg::model::box<point> box; 
typedef std::pair<box, size_t> value; 

// create the rtree using default constructor 
bgi::rtree<value, bgi::linear<500> > rtree; 

// create some values 
ifstream ifs(bbox_filename); 
if (!ifs.is_open()) return; 

std::vector<box> boxes; 

boost::timer t; 

// ... (read box from test file) 

std::cout << "read bbox file: " << t.elapsed() << " sec." << std::endl; 

t.restart(); 
for (size_t i = 0; i < boxes.size(); ++i) 
{ 
    // insert new value 
    rtree.insert(std::make_pair(boxes[i], i)); 
} 
std::cout << "build rtree with " << boxes.size() << " boxes in total: " << t.elapsed() << " sec." << std::endl; 

を、要素の数は数千万人となり、クエリの速度が速いと許容ですが、建物RTREEの速度が非常に遅い(O2がありますもちろん有効です)。

gcc 4.4.7で同じテストプログラムをコンパイルしてテスト結果を比較したところ、gccのバージョンが原因です。

テスト環境:GCC 3.4.5のための

read bbox file: 22.13 sec. 
build rtree with 42517937 boxes in total: 163.28 sec. 

テストログ:GCC 4.4.7のための

CentOS 6.6 
Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz 

テスト・ログは

read bbox file: 22.28 sec. 
build rtree with 42517937 boxes in total: 468.73 sec. 

それはによってコンパイルされたテストプログラムを思わgcc 3.4.5では、rtreeを構築するのに約4.4倍の時間がかかります。

以前にこの問題を抱えた人はいますか? gcc 3.4.5のパフォーマンスを改善するためのアドバイスはありますか?

おかげで、

+0

あなたの最善の策は、3.4.5が間違っていることを理解し、それを避けるためにrtreeのコピーを修正しようとしていると思います。おそらく、ツリーをアセンブルしている間、ペアまたは 'linear <500>'のコピーを削除する最適化です。また、コンパイルエラーを処理する価値のある、内部的に参照の処理が明らかに改善されているかどうかを調べるために、1.57を最新の値と比較する価値があります。また、オブジェクトへのポインタについてrtreeのテンプレートを使って作業することもできますが、それはC++でなく、難しいかもしれません。 – Rup

+4

GCC 3.4.5は[10歳以上]です(https://gcc.gnu.org/gcc-3.4/)。あなたの会社にいる権限を持ってアップデートする価値がありますし、新しいバージョンがC++より優れている理由の1つとして、これを例に挙げましょう。 (新しいバージョンがあなたのコードベースで「うまく動作している」と仮定して) – Rup

+0

@Rup、あなたの返事をありがとう。私はまた、ブースト1.59とgcc 4.4.7でテストプログラムをコンパイルしました。性能はブースト1.57、gcc 4.4.7に匹敵します。劇的な改善はありません。 – wpc062

答えて

3

みんなの助けてくれてありがとうとポストpacking algorithm in rtree in boost

梱包アルゴリズム(レンジコンストラクタ)を使用した後に(私は:(現在コンパイラを選択することはできません)、RTREEを構築するのパフォーマンスが大幅に改善されます。

read bbox file: 23.07 sec. 
build rtree with 42517937 boxes in total: 8.15 sec. 
:GCC 4.4.7 +梱包アルゴリズムの

std::vector<value> boxes; 

boost::timer t; 

// ... (read box from test file) 

std::cout << "read bbox file: " << t.elapsed() << " sec." << std::endl; 

t.restart(); 
bgi::rtree<value, bgi::linear<500> > rtree(boxes); 
std::cout << "build rtree with " << boxes.size() << " boxes in total: " << t.elapsed() << " sec." << std::endl; 

テストログアルゴリズムを梱包のgcc 3.4.5 +のための3210

テストログ:

read bbox file: 23.06 sec. 
build rtree with 42517937 boxes in total: 10.94 sec. 

今のgcc 3.4.5と4.4.7の間のランタイム差が許容されます。

PS:テスト中に、O2とパッキングアルゴリズムを使用しないでrtreeをビルドしたときの実行時間が1000倍遅くなる可能性があります。この投稿がboost :: rtreeを使っている人に後でヒントを与えることができると願っています。

関連する問題