QT 百万级数据量快速切换绘制

本文探讨了在QCustomPlot库中处理百万级数据图表的效率问题。传统的setData()和addData()方法在处理大量数据时表现较慢,而通过直接操作内部数据指针并重新绘制,实现了更快的数据切换。实验结果显示,新方法在数据切换上仅需十几毫秒,显著提高了性能。博客还分享了关键代码和运行时的性能分析。

大概半年前面试过程中,有位面试官提出一个问题:百万级数据绘制图表,我该怎么做?当时我回答的是:用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使用整理

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值