我目前正在使用QCustomPlot
在Qt中绘制数字信号,但似乎当样本数大于10000000时,操作变得非常慢。我有一个time
向量和一个data
向量,我设置的数据如下:
QCustomPlot *plot;
QCPGraph *graph;
graph->setData(time, data);
有机会提高效率吗?
答案 0 :(得分:4)
因为QCustomPlot在内部使用QCPDataMap
(typedef
QMap<double, QCPData>
},这意味着它使用地图存储按x
坐标排序的实际数据(键)。不幸的是,QCPGraph::setData(const QVector<double> &x, const QVector<double> &y)
方法没有利用样本可以订购并且不使用插入提示这一事实,因此显着改善了结果:
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);
我不认为std::map
或QMap
s是在X,Y图上存储样本的最佳结构,因为对地图中的每个条目都进行了新的分配和释放正在谈论数以百万计的人。 QCustomPlot应该使用自定义分配器实现自定义映射类,以避免这些内存问题。