文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/128438303

红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

其他(编程相关)

上一篇:没有了
下一篇:敬请期待…

前言

  在做到个别项目对日志要求较高,要求并行写入的数据较多,尽管写入数据的线程放在子线程,仍然会造成界面程序的假死(实际上Qt还是在跑,只是磁盘消耗超过瓶颈,造成假死(注意:控制台还能看到打印输出,linux则能看到打印输出)。
  本篇开发了测试工具,并且测试了QFile在USB3.0和M.2SSD上的写入性能。

补充

  在海思Hi3559AV100,Hi3516DV300以及海思的开发过程中,也发现Qt会假死,后台仍然在继续打印,海思板上的Qt界面假死的原因并不是因为磁盘性能问题,可以解决但涉及到一些关键技术了,此处不提。

第一版本测试v1.0.0

  日志的操作,多半写入都是几十上百字节一条,特殊的项目要求写入不同的文件,分类保存,于是产出了第一版本的,用于测试Qt的。
  

测试工具v1.0.0下载地址

  CSDN粉丝0积分下载地址:https://download.csdn.net/download/qq21497936/87360595

关于对于“文件打开次数属性”的忽略

  理论上也可以忽略,测试跟理论结果一致,因为本身程序的文件打开次数,是新建一个然后写入操作完成后关闭,然后另外新建一个继续重复操作,是流水线排序的,所以这个对单线程写入影响不大。

  因为测试是获取了系统时间,次数少了测不出,次数多了越来越小,偶尔增大,所以可以判断,主要影响时间的还是QDateTime获取时间,然后计算的过程。

  

  

  

  选取1000次作为标准,测试文件打开次数的影响:

  

  
  打开次数基本无影响,但是一次测试可以利用这个来一次性测多次每个文件单独写入的耗时。

使用QFile测试结果

  

  

  太小了看不出:
  

  修改程序至v1.0.1版本,只看最终结果(为了模拟日志多线程写入不同文件),下面开始测试。

USB3.0移动硬盘测试结果

  

  

  所以,线程越开越多,在某一个阈值线程数(实际打开操作的文件数)会导致性能大幅下降,而且会持续有多个阈值类似的。

M.2主板上SSD测试结果

  

  

使用QFile(每次写后用flush)测试结果

USB3.0移动硬盘测试结果

  

  

M.2主板上SSD测试结果

  

  

  结论:这个明显收到硬盘数据传输的影响。

关键源码

void FileIoTestManager::slot_optFileUseQtQFile(int loopTime, int loopWrite, int dataSize, bool flush)
{QDir dir;QString dirPath = QString("%1/%2").arg(QApplication::applicationDirPath()).arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh_mm_ss_zzz"));if(dir.mkpath(dirPath)){message(QString("创建文件夹成功: %1").arg(dirPath));}else{message(QString("创建文件夹失败: %1").arg(dirPath));}// 生成数据message(QString("生成测试数据,数据长度: %1").arg(dataSize));QByteArray byteArray;byteArray.append(dataSize, 0xFF);message(QString("==========================测试开始=============================="));double totalTime = 0;           // 总计时间double fileTotalTime = 0;       // 操作单个文件总时间double writeFileTime = 0;       // 单个文件单词写入时间totalTime = QDateTime::currentDateTime().toMSecsSinceEpoch() * 1.0f;for(int loopIndex = 0; loopIndex < loopTime; loopIndex++){QString filePath = QString("%1/%2_%3").arg(dirPath).arg(QDateTime::currentDateTime().toString("hh_mm_ss_zzz")).arg(loopIndex, 6, 10, QChar('0'));QFile file(filePath);if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate)){message(QString(" 第%1次创建文件失败").arg(loopIndex + 1));continue;}writeFileTime = QDateTime::currentDateTime().toMSecsSinceEpoch();for(int writeIndex = 0; writeIndex < loopWrite; writeIndex++){//            message(QString("  第%1次写入文件,写入长度%2字节").arg(writeIndex + 1).arg(dataSize));int size = 0;while(size < byteArray.size()){int len = file.write(byteArray.mid(size));if(len < 0){message(QString("  第%1次写入文件,写入失败").arg(writeIndex + 1));message(QString("==========================测试失败=============================="));break;}
//                message(QString("  第%1次写入文件,写入成功").arg(writeIndex + 1));if(flush){file.flush();}size += len;if(_stop){file.close();message(QString("==========================测试手动停止==========================="));_stop = false;emit signal_finished();return;}}if(_stop){file.close();message(QString("==========================测试手动停止==========================="));_stop = false;emit signal_finished();return;}}writeFileTime = QDateTime::currentDateTime().toMSecsSinceEpoch() - writeFileTime;writeFileTime = writeFileTime / loopWrite;message(QString("每次写入数据平均耗时(不包含打开关闭文件): %1ms").arg(writeFileTime));
//        message(QString(" 第%1次关闭文件").arg(loopIndex + 1));file.close();}message(QString("==========================测试结果=============================="));totalTime = QDateTime::currentDateTime().toMSecsSinceEpoch() - totalTime;fileTotalTime = totalTime * 1.0f / loopTime;message(QString("操作创建文件次数: %1, 单个文件循环写入次数: %2, 每次写入固定数据长度: %3, %4").arg(loopTime).arg(loopWrite).arg(dataSize).arg(flush ? "每次使用flush" : "不使用flush"));message(QString("总耗时: %1ms").arg(totalTime));message(QString("单个文件循环写入平均总耗时(包括打开关闭文件): %1ms").arg(fileTotalTime));message(QString("每次写入数据平均耗时(包括打开关闭文件: %1ms").arg(fileTotalTime * 1.0f / loopWrite));message(QString("==========================测试结束=============================="));emit signal_finished();return;
}

工程模板

  

后续

  会持续补充测试其他方式,QFile的性能本身并不高。

上一篇:没有了
下一篇:敬请期待…

文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/128438303

文件IO操作开发笔记(一):使用Qt的QFile对磁盘文件存储进行性能测试以及测试工具相关推荐

  1. python io操作有什么_Python笔记:文件IO操作

    读取文件 使用open()打开文件,文件不存在会抛出IOError错误. try: f = open('/path/to/file', 'r') print(f.read()) finally: if ...

  2. 基于QT的【第一个项目】设计+所有组件配合使用+网络编程局域网通信+文件IO操作+登录界面和头像+多界面跳转+JSON数据解析+表情包制作

    基于QT的第一个项目+所有组件配合使用+网络编程局域网通信+文件IO操作+登录界面和头像+多界面跳转+JSON数据解析+表情包制作 第一阶段 网络编程局域网TCP/IP聊天QT实现 main.c ma ...

  3. Linux基础(6)--文件IO操作

    文件IO操作 1. open打开操作 2. close关闭操作 3. creat创建操作 4. write写操作 5. read读操作 Linux下一切皆文件,所以文件IO是很重要的也是很基础的操作. ...

  4. Python 文件 IO 操作详解

    Python 文件 IO 操作详解 1.文件 IO 常用操作 2.文件打开操作 2.1 打开命令 2.2 命令参数 2.2.1 路径 2.2.2 mode 2.2.3 buffering 缓冲区 2. ...

  5. python和R文件IO操作对比及dataframe创建方式对比:read_csv、to_csv、write.csv、 data.frame、pd.DataFrame

    python和R文件IO操作对比及dataframe创建方式对比 很多工程师可能刚开始的时候只熟悉python或者R其中的一个进行数据科学相关的任务. 那么如果我们对比这学习可以快速了解语言设计背后的 ...

  6. linux的文件io操作(转)

    linux文件IO操作有两套大类的操作方式:不带缓存的文件IO操作,带缓存的文件IO操作.不带缓存的属于直接调用系统调用(system call)的方式,高效完成文件输入输出.它以文件标识符(整型)作 ...

  7. C++之文件IO操作流

    C++之文件IO操作流 前两节介绍了C++的IO流类库,标准设备IO操作流中部分预定义流对象的成员函数以及IO格式控制.那今天我将继续介绍关于C++中的流操作内容--文件IO操作流fstream.并会 ...

  8. NIO详解以及NIO的文件IO操作

    一.NIO概述 java.nio全称java non-blockingIO,是指JDK1.4开始提供的新API.从JDK1.4开始,Java提供了一系列改进的输入/输出的新特性,被统称为NIO(即Ne ...

  9. C++之 文件IO操作流

    关于C++中的流操作内容--文件IO操作流fstream.并会着重讲解C++是如何对文件进行操作的. 文件指存放在外部介质上的数据的集合.大家都知道操作系统是以文件为单位来对数据进行管理的.因此如果你 ...

最新文章

  1. vbs枚举磁盘访问磁盘信息
  2. 从存储区提供程序的数据读取器中进行读取时出错_三菱伺服控制程序写法破析...
  3. rate limiter - system design
  4. WdOS源码编译安装MySQL 5.5.25a
  5. time zone issue in text processing
  6. 10道腾讯的Java面试题
  7. flink 卡夫卡_卡夫卡–一次语义学
  8. 方便维护下拉框数据的UI设计
  9. python数据挖掘学习笔记】十九.鸢尾花数据集可视化、线性回归、决策树花样分析
  10. jmeter报告分析工具
  11. 百度商桥放在php网站哪里_网站优化的几个重要技巧,你知道吗?
  12. P3146 [USACO16OPEN]248 P3147 [USACO16OPEN]262144
  13. OpenGL——颜色混合 glBlendFunc函数
  14. jsp 与html 如何结合使用方法,jsp中如何写javascript?
  15. SharePoint 2010 中型场(Farm)——性能研究(来自DeLL技术中心博客)
  16. 微积分(第二版) 吴传生 编|高等教育出版 课后习题答案
  17. Win10系统开启黑暗主题
  18. 刚毕业不久就被裁了,然后就一直没上班了,谈谈体验吧!
  19. “对症下药”的11种新的编程语言
  20. Win10文件或目录损坏且无法读取修复方法

热门文章

  1. html5使用画布标签显示wmf,在RES.web.Html5VersionController废弃后,如何做版本管理
  2. 凌华科技获Compass Intelligence票选年度“最佳边缘计算公司”
  3. Generalized Incomplete Multiview Clustering With Flexible Locality Structure Diffusion
  4. Vue+网络协议+Webpack高频面试题
  5. java计算机毕业设计消防网站源码+系统+数据库+lw文档+mybatis+运行部署
  6. 【GNN报告】潘世瑞: 图自监督新范式-重新思考图对比学习
  7. 南通数字孪生智能工厂,数字工厂智能车间建设,3d可视化工业建模,三维数据交互大屏系统开发
  8. 【官宣】四六级成绩已公布12月补报不可错过
  9. Web前端登录拼图验证功能,看你是人还是机器
  10. 2547 东方辉针城