3

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

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

有没有机会提高效率?

4

1 回答 1

4

因为 QCustomPlot 在内部使用 a QCPDataMap(这是 a typedefof 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::maps 或QMaps 是在 X、Y 图上存储样本的最佳结构,因为对地图中的每个条目都进行了新的分配和释放,而且我们谈论的是数百万个。QCustomPlot 应该使用自定义分配器实现自定义地图类,以避免这些内存问题。

于 2014-12-11T07:44:52.683 回答