文件IO操作开发笔记(二):使用Cpp的ofstream对磁盘文件存储进行性能测试以及测试工具

news2024/11/29 16:12:43

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

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

其他(编程相关)

上一篇:《文件IO操作开发笔记(一):使用Qt的QFile对磁盘文件存储进行性能测试以及测试工具》
下一篇:敬请期待…


前言

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


版本v1.1.0

  更新版本版本,新增了c++的ofstream写入方式。
  在这里插入图片描述


测试工具v1.1.0下载地址

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


使用C++的ofstream测试结果

USB3.0移动硬盘测试结果

   在这里插入图片描述
    在这里插入图片描述

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

M.2主板上SSD测试结果

    在这里插入图片描述
   在这里插入图片描述


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

USB3.0移动硬盘测试结果

    在这里插入图片描述
    在这里插入图片描述

M.2主板上SSD测试结果

  在这里插入图片描述
  在这里插入图片描述
  结论:这个明显受到硬盘数据传输的影响。


关键代码

void FileIoTestManager::slot_optFileUseCppOfstream(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'));
        std::ofstream outFile;
        outFile.open(filePath.toUtf8().constData());
        writeFileTime = QDateTime::currentDateTime().toMSecsSinceEpoch();
        for(int writeIndex = 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;
                emit signal_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("==========================测试结束=============================="));

    emit signal_finished();
    return;
}

工程模板v1.1.0

  在这里插入图片描述


后续

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


上一篇:《文件IO操作开发笔记(一):使用Qt的QFile对磁盘文件存储进行性能测试以及测试工具》
下一篇:敬请期待…


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/152503.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker | 深度学习中的docker看这一篇就够啦

目录 1.了解Docker 1.1.为什么要用docker? 1.2.可以用docker做什么? 1.3.docker 框架 2.Docker 的基本使用 3.实例 :VS code远程连接服务器上的docker环境 3-1:环境框架可视化及ssh连接&#xff0c;搭建pytorch深度学习环境 3-2:搭建一个新的容器pytorch深度学习环境…

北大硕士LeetCode算法专题课-数组相关问题

算法专题&#xff1a; 北大硕士LeetCode算法专题课---算法复杂度介绍_骨灰级收藏家的博客-CSDN博客 北大硕士LeetCode算法专题课-基础算法之排序_骨灰级收藏家的博客-CSDN博客 北大硕士LeetCode算法专题课-基础算法查找_骨灰级收藏家的博客-CSDN博客 数组相关问题 双指针 …

20-FreeRTOS队列API函数

1- xQueueCreate queue. hQueueHandle_t xQueueCreate( UBaseType_t uxQueueLength,UBaseType_t uxItemSize );创建一个新队列并返回 可引用此队列的句柄。 configSUPPORT_DYNAMIC_ALLOCATION 必须在 FreeRTOSConfig.h 中被设置为 1&#xff0c;或保留未定义状态&#xff08;此…

ShardingSphere分库分表schema名称导致NPE问题排查记录

前段时间把 ShardingSphere 升级到了 5.1.1 版本&#xff0c;奈何官方版本升级太快跟不上速度&#xff0c;这不最近又发现了一个 BUG。 问题现象 数据库做了分库分表&#xff0c;在需要查询多表数据进行 merge 的时候发生了一个 NPE 的异常。 Caused by: java.lang.NullPoin…

【数据结构】前缀树/字典树

目录1.概述2.代码实现3.应用本文参考&#xff1a; LeetCode 208.实现 Trie (前缀树) 1.概述 前缀树又称字典树、Trie 树、单词查找树&#xff0c;是一棵有根树&#xff0c;同时也是一种哈希树的变种&#xff0c;其每个节点包含以下字段&#xff1a; 指向子节点的指针数组 chi…

pytorch 分布式调试debug torch.distributed.launch

文章目录一. pytorch 分布式调试debug torch.distributed.launch 三种方式1. 方式1&#xff1a;ipdb调试&#xff08;建议&#xff09;命令行使用pdb未解决&#xff1a;2. 方式2&#xff1a;使用pycharm进行分布式调试&#xff08;侵入式代码&#xff09;3. 方式3&#xff1a;使…

HRNet源码阅读笔记(5),庞大的PoseHighResolutionNet模块-transition1

在stage1的最后&#xff0c;分支了。就是所谓的transition1&#xff0c;详见下面的第13行。def forward(self, x):x self.conv1(x)x self.bn1(x)x self.relu(x)x self.conv2(x)x self.bn2(x)x self.relu(x)x self.layer1(x)x_list []for i in range(self.stage2_cfg[NU…

【前端之旅】Webpack模块打包工具

一名软件工程专业学生的前端之旅,记录自己对三件套(HTML、CSS、JavaScript)、Jquery、Ajax、Axios、Bootstrap、Node.js、Vue、小程序开发(Uniapp)以及各种UI组件库、前端框架的学习。 【前端之旅】Web基础与开发工具 【前端之旅】手把手教你安装VS Code并附上超实用插件…

【图的存储】

更好的阅读体验\color{red}{更好的阅读体验}更好的阅读体验 文章目录1. 邻接矩阵2. 边集数组3. 邻接表4. 链式邻接表5. 链式前向星总结1. 邻接矩阵 思想&#xff1a; 利用二维数组 g[N][N] 存储所有的点到点的权值。其中 N 为点的数量&#xff0c;g[i][j] 表示点 i 到点 j 的权…

【C++】容器适配器

文章目录一. 什么是适配器?什么是容器适配器?二.理解容器适配器stack的模拟实现queue的模拟实现一. 什么是适配器?什么是容器适配器? 适配器是一种设计模式&#xff08;设计模式是一套被反复使用的&#xff0c;多数人知晓的&#xff0c;经过分类编目的&#xff0c;代码设计…

CAD未协调的新图层怎么处理?

在打开CAD图纸时&#xff0c;系统提示图形存在为协调的新图层是什么意思&#xff1f;所谓未协调图层&#xff0c;是指上次打印或者保存之类命令后新增的图层&#xff0c;大部分情况下增加新的外部参照时会把所有外部参照中的图层标记为未协调图层。CAD未协调的新图层怎么处理&a…

2023年底,我要通过这5点,实现博客访问量500W

说实话&#xff0c;这真的是一个非常高远的flag&#xff0c;因为我目前只有35W&#xff0c;但根据我2个月前还是12W的访问量&#xff0c;我觉得我还是可以拼一把的&#xff0c;在这里我想向大家分享一下我的计划&#xff0c;如何达成2023年底&#xff0c;博客访问量达到500W的K…

期刊会议排名、信息检索网站推荐、IEEE Latex模板下载(更新中...)

一.拿到一个期刊或论文&#xff0c;不知道他的影响因子、分区类型等等信息&#xff0c;可以使用以下几个网站搜索一下。二.一些会议期刊搜索1.国外The Latest Information Technology Conference and Journal List - Conference Partner&#xff08;信息技术最新国际会议和期刊…

Java程序员必知四种负载均衡算法

前言 一般来说&#xff0c;我们在设计系统的时候&#xff0c;为了系统的高扩展性&#xff0c;会尽可能的创建无状态的系统&#xff0c;这样我们就可以采用集群的方式部署&#xff0c;最终很方便的根据需要动态增减服务器数量。但是&#xff0c;要使系统具有更好的可扩展性&…

直观理解--马氏距离

首先我们很了解欧氏距离了&#xff0c;就是用来计算欧式空间&#xff08;就是我们常见的坐标系&#xff09;中两个点的距离的。 比如点 x(x1,…,xn)x (x_1,…,x_n)x(x1​,…,xn​) 和 y(y1,…,yn)y (y_1,…,y_n)y(y1​,…,yn​) 的欧氏距离为&#xff1a; d(x,y)(x1−y1)2(x2…

依靠小游戏带动产品增收,app运营这样做

大家都玩过小游戏吧&#xff1f;从小时候的4399游戏平台到现在的微信小游戏&#xff0c;尤其是风靡一时的“跳一跳”和“羊了个羊”都曾上榜热搜&#xff0c;让人印象深刻。在当下小游戏爆火社交平台的不断出现的背景下&#xff0c;小游戏的发展劲头更是强盛。 小游戏的吸引力在…

Memblaze发布大容量企业级SSD:支持32T最大容量,性能更强!

2023年1月10日 —— 今天&#xff0c;北京忆恒创源科技股份有限公司&#xff08;Memblaze&#xff09;正式发布 PBlaze6 6930 系列 PCIe 4.0 企业级 NVMe SSD。PBlaze6 6930 面向企业高性能业务应用开发&#xff0c;有着 1600K/680K IOPS 的 4K 随机读/写性能&#xff0c;具备更…

Mysql常见面试题

Mysql常见面试题汇总①⭐事务的基本特性和隔离级别⭐ACID靠什么保证⭐什么是MVCC⭐mysql的主从同步原理简述MyISAM和InnoDB的区别简述mysql中索引类型以及对数据库的性能影响⭐索引的基本原理Mysql聚簇索引和非聚簇索引的区别⭐B树和B树的区别&#xff0c;为什么Mysql使用B树My…

第04讲:Docker部署MySQL8

MySQL 的 Docker 镜像在 dockerhub 上的地址&#xff1a;https://hub.docker.com//mysql 当前&#xff08;2021-04-02&#xff09;的 latest 和 8.0.23 是同一个镜像 。另外&#xff0c;5.7 版本和 5.7.33 是同一个镜像 第1步&#xff1a;安装mysql 查询中央仓库 docker se…

Kestrel封装在WindowService中(.net5,.net6,.net7三个版本的介绍)

Kestrel封装在WindowServer中背景关于WindowsServer开发服务.NET5版本建项目添加Controller添加引用修改Startup.cs修改Program.cs配置Kestrel监听发布程序通过命令行创建服务关于SC命令启动服务查看效果测试效果.NET6错误1解决办法&#xff1a;错误2运行效果如下图.NET7版本&a…