2016-05-06 4 views
2

Поскольку gcc 3.4.5 используется во всей компании, я должен использовать rtree boost 1.57, потому что rtree boost 1.59 имеет проблему компиляции. я просто использовать 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 очень медленно (О2 конечно).

Когда я скомпилировал ту же тестовую программу с gcc 4.4.7 и сравнил результат тестирования, я нашел ее из-за версии gcc.

Тестовая среда:

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

тест журнала для GCC 4.4.7: журнал

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

тест для GCC 3.4.5:

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

кажется тестовую программу, составленную gcc 3.4.5 занимает около 3-х раз, чтобы построить rtree, чем 4.4.7.

Есть ли кто-нибудь, кто раньше встречался с этой проблемой? Любые советы по улучшению производительности в gcc 3.4.5? (Я не могу выбрать компилятор в настоящее время :()

Спасибо,

+0

Я думаю, что лучше всего попытаться понять, что делает 3.4.5, и исправить вашу копию rtree, чтобы избежать этого. Вероятно, это оптимизация, чтобы устранить некоторую копию либо пары, либо «линейной» <500> 'при сборке дерева. Также может стоить сравнить 1.57 с последним повышением, чтобы увидеть, есть ли какие-либо очевидные улучшения в его обработке ссылок внутри, что было бы полезно работать с ошибками компиляции. Вы могли бы также попытаться заставить все работать с шаблонами rtree на указателях на объекты, но это меньше C++ и, вероятно, тоже сложно. – Rup

+4

Это означает, что GCC 3.4.5 [старше десяти лет] (https://gcc.gnu.org/gcc-3.4/). Это определенно стоит повысить обновление с полномочиями, которые есть в вашей компании, и дать им это в качестве примера, почему более новые версии лучше C++. (предполагая, что новые версии «просто работают» с вашими кодами) – Rup

+0

@Rup, Спасибо за ваш ответ. Я также скомпилировал тестовую программу с boost 1.59 и gcc 4.4.7.Его производительность сравнима с повышением 1.57 и gcc 4.4.7. Нет никакого существенного улучшения. – wpc062

ответ

3

Спасибо за помощь каждого и пост packing algorithm in rtree in boost.

После использования упаковки алгоритма (конструктор диапазона), производительность строительства rtree значительно улучшилось.

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 4.4.7 + упаковка алгоритма:

read bbox file: 23.07 sec. 
build rtree with 42517937 boxes in total: 8.15 sec. 

тест журнала для GCC 3.4.5 + упаковка алгоритма:

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

Теперь разница во время выполнения между GCC 3.4.5 и 4.4.7 является приемлемым.

PS: Во время моего теста время работы rtree без O2 и алгоритм упаковки могут быть в 1000 раз медленнее. Надеюсь, что этот пост может дать кому-то, кто использует boost :: rtree позже некоторый намек.

Смежные вопросы