【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

这篇具有很好参考价值的文章主要介绍了【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

简介

本文介绍了QT模型视图代理框架中的QT表格控件和QT数据库模块中的QT数据库查询模型结合使用的一个应用实践案例:QT高性能表格控件分页展示千万行数据。本文介绍了这个应用实践案例的运行效果和源代码。这个应用实践案例实测运行表明,QT表格控件具备在3毫秒之内快速从1000万数据记录的SQLite数据库的一个数据表中查询读取10000记录的能力。 本文还介绍了QT表格控件和QT数据库模块的一些总体情况。本文最后通过QT框架的源代码调试运行分析了QT表格控件的性能为什么如此之高。

文章目录

  • QT高性能表格控件分页展示百万行数据运行效果展示
    • 系统配置
    • 1000万条记录的数据表中一次读取1万条记录
    • 1000万条记录的数据表中一次读取10万条记录
    • 1000万条记录的数据表中一次读取100万条记录
  • QT高性能表格控件分页展示百万行数据应用程序源代码
    • QT初始化数据表代码:1000万条记录
    • QT主界面代码
  • QT表格控件
    • QT图形视图框架整体介绍
    • QT表格控件
    • QT表格窗口
  • QT数据库组件
    • QT数据库模块整体介绍
    • 用户界面层(UI Layer)
    • SQL接口层(SQL API Layer)
    • 驱动程序层(Driver Layer)
  • QT表格控件的性能何以如此之高?
    • 查询和遍历不是同一个概念
    • 对预取数据的支持
    • 还有更多数据记录吗?

正文

QT高性能表格控件分页展示百万行数据运行效果展示

系统配置

硬件配置: SSD。
操作系统: Windows。
数据库系统:SQLite数据库。
QT版本: QT。

1000万条记录的数据表中一次读取1万条记录

实测结果:1000万条记录的数据表中一次读取1万条记录,首次查询耗时小于3毫秒(ms=千分之一秒),后续查询耗时小于1毫秒。采用整数主键查询,主键在数据表中的位置对查询性能没有显著影响。

【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

QT高性能表格控件1000万条记录的数据表中展示1万条记录

QT表格控件+QT数据库模块:1000万条记录的数据表中一次读取1万条记录

1000万条记录的数据表中一次读取10万条记录

实测结果:1000万条记录的数据表中一次读取10万条记录,首次查询耗时小于3毫秒(ms=千分之一秒),后续查询耗时小于1毫秒。

【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

QT高性能表格控件1000万条记录的数据表中展示10万条记录

QT表格控件+QT数据库模块:1000万条记录的数据表中一次展示10万条记录

1000万条记录的数据表中一次读取100万条记录

实测结果:1000万条记录的数据表中一次读取100万条记录,首次查询耗时小于3毫秒(ms=千分之一秒),后续查询耗时小于1毫秒。

【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

QT高性能表格控件1000万条记录的数据表中展示100万条记录

QT表格控件+QT数据库模块:1000万条记录的数据表中一次读取100万条记录
使用QT 模型视图代理框架实现1000完条记录的数据表中读取1000条记录的运行效果的视频参考如下:

视频: QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化效果

QT能否撑得起千万级数据表这样的规模?看完补天云这个实测视频就有答案了! QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

QT高性能表格控件分页展示百万行数据应用程序源代码

为了减少本文的篇幅,在此只列举了一部分关键代码。

QT初始化数据表代码:1000万条记录

几个有关的常量。
【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

QT高性能表格控件性能测试程序用到的常数
【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

QT高性能表格控件性能测试程序

数据库初始化代码:

【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

QT高性能表格控件性能测试程序

【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

QT高性能表格控件性能测试程序
【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

QT高性能表格控件性能测试程序
【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

QT高性能表格控件性能测试程序

【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

QT主界面代码

以下是主窗口也就是QT表格控件所在窗口的构造函数。

【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

QT高性能表格控件性能测试程序

【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

QT高性能表格控件性能测试程序

【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

QT高性能表格控件性能测试程序

【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

QT高性能表格控件性能测试程序

【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化
QT高性能表格控件性能测试程序

QT表格控件

QT图形视图框架整体介绍

下图是QT助手API DOC中介绍的QT Model-View-Delegate(模型视图代理)框架的整体结构。

【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

QT模型视图代理框架整体结构

图中Model就是模型,View是视图,Delegate是代理。三者之间的关系看图已经很清楚了。其中,View用于用户界面交互,包括数据展示的总体框架等;Model用于向View提供数据支持,包括查询数据和保存数据(修改和插入);Delegate用于具体展示数据和具体提供数据编辑功能的用户交互界面。

QT表格控件

QT模型视图代理框架中提供了很多视图类型,本文介绍的QT表格控件QTableView就是一种视图类型。这个类型提供了表格类型的界面常用的各种功能,包括对横向表头和纵向表头以及单元格的控制和修饰。

【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

QT表格控件界面美化效果演示

QT表格窗口

QT还提供了另外一种视图类型:QTableWidget类型,这个类型是QTableView类型的派生类型, 在QTableView的基础上做了更多粗粒度的封装的API接口,使得QTableWidget使用起来更加人性化,也就是符合大多数软件工程师的常规思维;当然QTableWidget也屏蔽了一些QTableView的底层细节API 接口,也就是有一些QTableView的一些API在QTableWidget中被使用C++的一些基础语法进行了屏蔽。

QT数据库组件

QT数据库模块整体介绍

QT助手API DOC中介绍了QT数据库模块的整体情况。

【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

QT数据库模块整体结构

QT数据库模块包含了用户界面层(UI Layer)、SQL接口层(SQL API Layer),和驱动程序层(Driver Layer)。

在QT应用程序中使用QT数据库模块,必须在项目文件中做如下配置。
对于CMake编译构建管理工具:
【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

QT数据库模块CMake编译构建管理项目配置

对于qmake编译构建管理工具:

【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

QT数据库模块qmake编译构建管理项目配置

用户界面层(UI Layer)

这里的UI可以理解成是数据库模块的普通应用开发者的API 接口;按照QT模型视图代理框架的概念体系,这个UI也可以理解成是这些类型可能会放在用户界面相关的程序代码中去用,比如在与视图有关的代码中去调用这些API。
比如QSqlQueryModel经常作为模型类型在模型视图代理框架中使用,当然也可以独立使用。

SQL接口层(SQL API Layer)

QT数据库模块使用QSqlDatabase类型提供通用的数据库的连接和SQL查询操作的API接口。

驱动程序层(Driver Layer)

QT数据库模块使用QSqlDriver类型定义了一些数据库的一些抽象的底层操作。特定数据库相关的具体实现有特定数据库对应的派生类提供。
QT 助手API DOC中描述了QT框架对特定数据库的支持情况如下图所示:

【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

QT数据库模块驱动程序层

QT表格控件的性能何以如此之高?

查询和遍历不是同一个概念

下面是在进行SQLite数据库查询之后,对10000条记录进行逐条记录遍历的代码。

QT数据库模块查询遍历实例代码
【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

经实测运行上述代码,遍历10000条记录耗时约30毫秒。

既然仅仅遍历10000条记录就耗时30毫秒,那么QT表格控件是如何做到只花了3毫秒就完成了数据库查询操作呢?

推测可能原因是QSqlQueryModel中并没有直接的完整遍历查询结果中的10000条记录,而是QTableView控件中只遍历了少量的数据记录。当用户拖动滚动条时,QTableView控件再根据实际需求请求QSqlQueryModel去遍历更多相应的数据记录。因此看起来就像是QT表格控件在小于1毫秒的时间之内就查询到了10000条记录,甚至100万条记录。

对预取数据的支持

本文作者经过调试QT源代码后发现了如下源代码:
【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

QT模型视图代理框架对数据预取的支持

这里定义了QAbstractItemView类型的数据记录的预取功能。每次当表格控件QTableView的界面发生变化时,就可能触发数据记录预取函数prefetch()的调用执行,这个函数每次预取255条数据记录。也就是说尽管执行SQL语句时从SQLite数据库中查询到了10000条记录,甚至100万条记录,但是QTableView每次只从查询结果中取出255条记录。这样搞当然极大的提升了包括QTableView在内的所有基于QAbstractItemView类型的视图控件的性能。

还有更多数据记录吗?

现在已经知道了QAbstractItemView每次只遍历255条数据记录,而QSqlQueryModel中的查询结果记录集中可能有10000条数据记录,甚至100万条数据记录。因此模型自己必须知道查询结果记录集中是否还有更多数据记录可以提供给QAbstractItemView视图,当然实际上是提供给这个类型的派生类QTableView之类的视图。

模型类的祖宗类QAbstractItemModel设计了两个跟数据预取有关的虚函数。
【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

QT模型视图代理框架中模型类与数据预取有关的虚函数

当然,包括QSqlQueryModel在内的各种具体模型类都实现了这两个虚函数,以此成为一个支持数据预取(prefetch)的模型类。canFetchMore()的作用是判断是否还能获取到更多的数据记录,如果是则返回TRUE否则返回FALSE。fetchMore()的作用是具体获取到更多的数据。

在这次调试实测过程中,创建了一个QSqlQueryModel的派生类ButianyunSqlQueryModel,用于观测何时调用这两个数据预取函数。

【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

ButianyunSqlQueryModel实现了数据预取虚函数

下面是调试过程中看到的函数调用栈。

【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化

QT模型视图代理框架中对数据预取函数的调用栈

至此对与本文主题相关的表格控件的调试分析工作已经完成。

总结

本文先通过一个具体应用实例(QT高性能表格控件分页展示百万行数据)展示了从1000万条SQLite数据记录中查询10000条记录并快速显示在QT表格控件的实际运行效果,同时给出了这个实例的一些源代码。然后介绍了QT表格控件QTableView和QT数据库组件的一些类型。后面又通过QT源码调试分析了为什么QT表格控件的性能如此之高的底层逻辑。

推荐QT性能优化技术博客专栏:
QT性能优化

如果您认为这篇文章对您有所帮助,请您一定立即点赞+喜欢+收藏,本文作者将能从您的点赞+喜欢+收藏中获取到创作新的好文章的动力。如果您认为作者写的文章还有一些参考价值,您也可以关注这篇文章的作者。文章来源地址https://www.toymoban.com/news/detail-632733.html

到了这里,关于【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分页查询优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 高性能MySQL实战(三):性能优化

    大家好,我是 方圆 。这篇主要介绍对慢 SQL 优化的一些手段,而在讲解具体的优化措施之前,我想先对 EXPLAIN 进行介绍,它是我们在分析查询时必要的操作,理解了它输出结果的内容更有利于我们优化 SQL。为了方便大家的阅读,在下文中规定类似 key1 的表示二级索引,key_

    2024年02月11日
    浏览(73)
  • 《高性能MySQL》——查询性能优化(笔记)

    将查询看作一个任务,那么它由一系列子任务组成,实际我们所做的就是: 消除一些子任务 减少子任务的执行次数 让子任务运行更快 查询的生命周期大概可分为 = { 客户端 服务器 : 进行解析 , 生成执行计划 执行:包括到存储引擎的调用,以及用后的数据处理 { 排序 分组

    2024年02月13日
    浏览(57)
  • 【Linux高性能服务器编程】——高性能服务器框架

      hello !大家好呀! 欢迎大家来到我的Linux高性能服务器编程系列之高性能服务器框架介绍,在这篇文章中, 你将会学习到高效的创建自己的高性能服务器,并且我会给出源码进行剖析,以及手绘UML图来帮助大家来理解,希望能让大家更能了解网络编程技术!!! 希望这篇

    2024年04月25日
    浏览(61)
  • 高性能RPC框架解密

    专栏集锦,大佬们可以收藏以备不时之需: Spring Cloud 专栏: Python 专栏: Redis 专栏: TensorFlow 专栏: Logback 专栏: 量子计算: 量子计算 | 解密著名量子算法Shor算法和Grover算法 AI机器学习实战: AI机器学习实战 | 使用 Python 和 scikit-learn 库进行情感分析 AI机器学习 | 基于lib

    2024年01月17日
    浏览(69)
  • C++高性能优化编程之如何测量性能(一)

    C++高性能优化编程系列 深入理解设计原则系列 深入理解设计模式系列 高级C++并发线程编程 不好的编程习惯,不重视程序性能测量分析让代码跑的更快,会导致 浪费大量的CPU周期、程序响应时间慢以及卡顿,用户满意度下降,进而浪费大量的时间返工去重构本应该一开始就

    2024年02月06日
    浏览(65)
  • MySQL高性能优化规范建议

    数据库命令规范 数据库基本设计规范 1. 所有表必须使用 Innodb 存储引擎 2. 数据库和表的字符集统一使用 UTF8 3. 所有表和字段都需要添加注释 4. 尽量控制单表数据量的大小,建议控制在 500 万以内。 5. 谨慎使用 MySQL 分区表 6.尽量做到冷热数据分离,减小表的宽度 7. 禁止在表中建

    2024年02月12日
    浏览(52)
  • Kafka高性能集群部署与优化

    Kafka 是由Apache Software Foundation开发的一个分布式流处理平台,源代码以Scala编写。Kafka最初是由LinkedIn公司开发的,于2011年成为Apache的顶级项目之一。它是一种高吞吐量、可扩展的发布订阅消息系统,具有以下特点: 高吞吐量:Kafka每秒可以处理数百万条消息。 持久化:数据存

    2024年02月13日
    浏览(62)
  • 如何评估和优化系统的高性能

    系统的关键性能指标:吞吐量,延迟和TP。 吞吐量:反应单位时间内处理请求的能力。 延迟:从客户端发送请求到接收响应的时间。 延迟和吞吐量的曲线如下图所示: 总体来看,随着压力增大,系统单位时间内被访问的次数增加。结合延迟和吞吐量观察的话,系统优化性能

    2024年02月22日
    浏览(59)
  • 数据库——MySQL高性能优化规范

    所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用 MySQL 保留(如果表名中包含查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过 32 个字符 临时库表必须以 tmp_为前缀并以日期为后缀,

    2024年02月11日
    浏览(104)
  • 读高性能MySQL(第4版)笔记10_查询性能优化(上)

    4.11.1.1. 在存储引擎层完成的 4.11.2.1. 直接从索引中过滤不需要的记录并返回命中的结 4.11.2.2. 在MySQL服务器层完成的,但无须再回表查询记录 4.11.3.1. 在MySQL服务器层完成 4.11.3.2. 需要先从数据表中读出记录然后过滤 4.13.2.1. 使用单独的汇总表 5.5.1.1. 定期清除大量数据时,

    2024年02月08日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包