如何使用QCustomPplot有效地绘制大型时间序列



我目前正在用QCustomPlot在Qt中绘制数字信号,但是当样本数量大于10000000时,操作似乎变得非常慢。我有一个time向量和一个data向量,我像这样设置数据:

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

有机会提高工作效率吗?

因为QCustomPlot在内部使用QCPDataMap(这是QMap<double, QCPData>typedef),这意味着它使用映射来存储按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 s 或 QMap s 是在 X,Y 图上存储样本的最佳结构,因为对地图中的每个条目都会进行新的分配和释放,我们正在谈论数百万个。QCustomPlot 应使用自定义分配器实现自定义映射类,以避免这些内存问题。

最新更新