美文网首页
文件IO操作开发笔记(二):使用Cpp的ofstream对磁盘文

文件IO操作开发笔记(二):使用Cpp的ofstream对磁盘文

作者: 红模仿_红胖子 | 来源:发表于2023-01-10 12:12 被阅读0次

前言

在做到个别项目对日志要求较高,要求并行写入的数据较多,尽管写入数据的线程放在子线程,仍然会造成界面程序的假死(实际上Qt还是在跑,只是磁盘消耗超过瓶颈,造成假死(注意:控制台还能看到打印输出,linux则能看到打印输出)。

本篇升级了测试工具,并且测试了ofstream在USB3.0和M.2SSD上的写入性能。

版本v1.1.0

更新版本版本,新增了c++的ofstream写入方式。

测试工具v1.1.0下载地址

  请自行溯源搜索,发不出

使用C++的ofstream测试结果

USB3.0移动硬盘测试结果

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

M.2主板上SSD测试结果

使用C++的ofstream(用flush)测试结果

USB3.0移动硬盘测试结果

M.2主板上SSD测试结果

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

关键代码

voidFileIoTestManager::slot_optFileUseCppOfstream(intloopTime,intloopWrite,intdataSize,boolflush){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("==========================测试开始=============================="));doubletotalTime=0;// 总计时间doublefileTotalTime=0;// 操作单个文件总时间doublewriteFileTime=0;// 单个文件单词写入时间totalTime=QDateTime::currentDateTime().toMSecsSinceEpoch()*1.0f;for(intloopIndex=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'));std::ofstream outFile;outFile.open(filePath.toUtf8().constData());writeFileTime=QDateTime::currentDateTime().toMSecsSinceEpoch();for(intwriteIndex=0;writeIndex<loopWrite;writeIndex++){//            message(QString("  第%1次写入文件,写入长度%2字节").arg(writeIndex + 1).arg(dataSize));outFile<<byteArray.constData();if(flush){outFile.flush();}if(_stop){outFile.close();message(QString("==========================测试手动停止==========================="));_stop=false;emitsignal_finished();return;}}writeFileTime=QDateTime::currentDateTime().toMSecsSinceEpoch()-writeFileTime;writeFileTime=writeFileTime/loopWrite;message(QString("每次写入数据平均耗时(不包含打开关闭文件): %1ms").arg(writeFileTime));//        message(QString(" 第%1次关闭文件").arg(loopIndex + 1));outFile.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("==========================测试结束=============================="));emitsignal_finished();return;}

工程模板v1.1.0

后续

  会持续补充测试其他方式,ofstream本次测试比QFile的性能还差一些。

相关文章

  • 文件IO操作开发笔记(二):使用Cpp的ofstream对磁盘文

    前言 在做到个别项目对日志要求较高,要求并行写入的数据较多,尽管写入数据的线程放在子线程,仍然会造成界面程序的假死...

  • python文件处理、路径处理、序列化和反序列化

    文件IO常用操作 一般说IO操作,指的是文件IO,如果指的是网络IO,会直接说。 把文件存储到磁盘上的这个过程,叫...

  • [Pt_06] Python对文件的读写处理

    目录结构 一、Python文件处理方式 磁盘IO:对磁盘中持久化文件(不因关闭系统而消失)的读&写操作读:将磁盘中...

  • 文件IO操作开发笔记(一):使用Qt的QFile对磁盘文件存储进

    前言 在做到个别项目对日志要求较高,要求并行写入的数据较多,尽管写入数据的线程放在子线程,仍然会造成界面程序的假死...

  • IO优化

    整个IO操作由应用程序,文件系统和磁盘组成。 1:文件损坏的原因 应用程序中的IO操作不是原子操作,文件的跨进程写...

  • C++ 简单文件读写

    需要包括库文件 (1) ofstream:写操作,输出文件类;(2) ifstream:读操作...

  • 跟我一起学Python(八)

    一、IO编程 读写文件是最常见的IO操作,Python内置了读写文件的函数。文件读写的原理:在磁盘上读写文件的功能...

  • Java的IO操作

    Java的IO操作分为磁盘IO和内存流IO。 1、磁盘IO:FileInputStream和FileOutputS...

  • Python读写文件

    Python 中读写文件是最为常见的磁盘IO操作,小伙伴们在使用 Python 处理数据时,有一部分数据是以文件的...

  • 文件读写

    读写文件(文件是由字节组成的信息,在磁盘永久保存)是最常见的IO操作。文件分为文本文件和二进制文件。文本文件可以使...

网友评论

      本文标题:文件IO操作开发笔记(二):使用Cpp的ofstream对磁盘文

      本文链接:https://www.haomeiwen.com/subject/mzwpcdtx.html