3

I am currently plotting a digital signal in Qt with QCustomPlot but it seems that when the number of samples is greater than 10000000 the operation becomes very slow. I have a time vector and a data vector and I'm setting the data like this:

QCustomPlot *plot;
QCPGraph *graph;
graph->setData(time, data); 

Any chance to make this more efficient?

1 Answer 1

4

Because QCustomPlot uses internally a QCPDataMap (which is a typedef of QMap<double, QCPData>) this means that it is using a map to store the actual data sorted by x coordinates (keys). Unfortunately the QCPGraph::setData(const QVector<double> &x, const QVector<double> &y) method doesn't take advantage of the fact that samples could be ordered and doesn't use the insertion hint, so this improved results significantly:

QCPDataMap *data = new QCPDataMap();
size_t len = x.size();
auto xp = std::begin(x);
auto yp = std::begin(y);
while (len--)
    data->insertMulti(data->constEnd(), *xp, QCPData(*xp++, *yp++)); 
graph->setData(data);

I don't think that std::maps or QMaps is the best structure to store samples on X,Y graphs because a new allocation and release is done for every entry in the map and we are talking about millions of them. QCustomPlot should implement a custom map class with a custom allocator to avoid these memory issues.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.