大概半年前面试过程中,有位面试官提出一个问题:百万级数据绘制图表,我该怎么做?当时我回答的是:用qcustomplot绘制,但是会非常慢。紧接着面试官提问:如何改进绘制慢的问题?当时我没回答上来,最近有空研究一下这个问题。
老方法
根据qcustomplot自带的example例程,向界面上的graph设置数据用setData()函数,添加数据用addData()函数。但是在设置一百万数据时能花我好几秒,肯定跟不上速度要求。
新方法
在我预设的场景中,一百万的数据已经有了,要实现的是如何快速地切换这些一百万的数据。
比较快的解决方式是:
在对应的graph中将data指针取出来,直接将我们要切换的数据赋给它,然后replot一下,就可以很快的切换数据;同样也适用于在原数据末尾增加数据,但是如果想在原数据中间插入数据的话,速度会慢很多,因为需要花费时间在排序上。
关键代码摘录:
.h
QSharedPointer<QCPGraphDataContainer> dataContainer;
void MainWindow::init_graph()
dataContainer = ui->plot_widget->graph(0)->data();
void MainWindow::on_btn_1_clicked()
dataContainer->set(data_list.at(graph_index)->data,true);
ui->plot_widget->xAxis->setRange(x_min, x_max);
ui->plot_widget->yAxis->setRange(y_min, y_max);
ui->plot_widget->replot();
运行结果分析:
MainWindow::MainWindow "界面启动完成,耗时37ms" 0x5e14
MainWindow::init_data_value_subfunction "第6次数据添加完成,数据量1000000,耗时326ms" 0x7d58
MainWindow::init_data_value_subfunction "第2次数据添加完成,数据量1000000,耗时333ms" 0x57ec
MainWindow::init_data_value_subfunction "第9次数据添加完成,数据量1000000,耗时344ms" 0x1340
MainWindow::init_data_value_subfunction "第3次数据添加完成,数据量1000000,耗时353ms" 0x679c
MainWindow::init_data_value_subfunction "第1次数据添加完成,数据量1000000,耗时361ms" 0x3404
MainWindow::init_data_value_subfunction "第7次数据添加完成,数据量1000000,耗时364ms" 0x5bc4
MainWindow::init_data_value_subfunction "第8次数据添加完成,数据量1000000,耗时367ms" 0x6908
MainWindow::init_data_value_subfunction "第4次数据添加完成,数据量1000000,耗时372ms" 0x7884
MainWindow::init_data_value_subfunction "第10次数据添加完成,数据量1000000,耗时372ms" 0x2f4
MainWindow::init_data_value_subfunction "第5次数据添加完成,数据量1000000,耗时378ms" 0x7c24
MainWindow::on_btn_1_clicked "第1次数据切换完成,数据量1000000,耗时20ms" 0x5e14
MainWindow::on_btn_1_clicked "第2次数据切换完成,数据量1000000,耗时14ms" 0x5e14
MainWindow::on_btn_1_clicked "第3次数据切换完成,数据量1000000,耗时14ms" 0x5e14
MainWindow::on_btn_1_clicked "第4次数据切换完成,数据量1000000,耗时14ms" 0x5e14
MainWindow::on_btn_1_clicked "第5次数据切换完成,数据量1000000,耗时15ms" 0x5e14
MainWindow::on_btn_1_clicked "第6次数据切换完成,数据量1000000,耗时15ms" 0x5e14
MainWindow::on_btn_1_clicked "第7次数据切换完成,数据量1000000,耗时15ms" 0x5e14
MainWindow::on_btn_1_clicked "第8次数据切换完成,数据量1000000,耗时14ms" 0x5e14
MainWindow::on_btn_1_clicked "第9次数据切换完成,数据量1000000,耗时13ms" 0x5e14
MainWindow::on_btn_1_clicked "第10次数据切换完成,数据量1000000,耗时14ms" 0x5e14
由输出打印结果可以得出:用新方法来切换大数据量的图表时,可以节省非常多的时间
本文探讨了在QCustomPlot库中处理百万级数据图表的效率问题。传统的setData()和addData()方法在处理大量数据时表现较慢,而通过直接操作内部数据指针并重新绘制,实现了更快的数据切换。实验结果显示,新方法在数据切换上仅需十几毫秒,显著提高了性能。博客还分享了关键代码和运行时的性能分析。

2万+

被折叠的 条评论
为什么被折叠?



