https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70899
Bug ID: 70899
Summary: Stateful Compare objects are very slow
Product: gcc
Version: 4.8.4
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: gccbugs at jbapple dot com
Target Milestone: ---
/*
The following code is four times slower with libstdc++ than with libc++.
I think the problem is partially too many copies in stl_heap.h. Instrumenting
the code with a copy constructor and a destructor shows two copies of a Comp
and two destructions for every call to push, while in libc++ it's only one call
to a copy constructor and one call to the destructor. It seems like zero calls
should be sufficient, as the Compare object could be kept around between push
calls and reused.
*/
#include <queue>
#include <vector>
#include <iostream>
using namespace std;
struct Comp {
vector<int> data;
Comp(int n) : data(n,n) {}
bool operator()(const double &x, const double &y) const { return x < y; }
};
int main() {
vector<double> data;
Comp comp(150000);
priority_queue<double, vector<double>, Comp> pq(comp, data);
for (int i = 0; i < 100000; ++i) {
pq.push(i);
}
cout << pq.top() << endl;
}