Поскольку 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? (Я не могу выбрать компилятор в настоящее время :()
Спасибо,
Я думаю, что лучше всего попытаться понять, что делает 3.4.5, и исправить вашу копию rtree, чтобы избежать этого. Вероятно, это оптимизация, чтобы устранить некоторую копию либо пары, либо «линейной» <500> 'при сборке дерева. Также может стоить сравнить 1.57 с последним повышением, чтобы увидеть, есть ли какие-либо очевидные улучшения в его обработке ссылок внутри, что было бы полезно работать с ошибками компиляции. Вы могли бы также попытаться заставить все работать с шаблонами rtree на указателях на объекты, но это меньше C++ и, вероятно, тоже сложно. – Rup
Это означает, что GCC 3.4.5 [старше десяти лет] (https://gcc.gnu.org/gcc-3.4/). Это определенно стоит повысить обновление с полномочиями, которые есть в вашей компании, и дать им это в качестве примера, почему более новые версии лучше C++. (предполагая, что новые версии «просто работают» с вашими кодами) – Rup
@Rup, Спасибо за ваш ответ. Я также скомпилировал тестовую программу с boost 1.59 и gcc 4.4.7.Его производительность сравнима с повышением 1.57 и gcc 4.4.7. Нет никакого существенного улучшения. – wpc062