Qt读取文件对比:每次获取自定义的长度和使用系统的API,耗时对比

0. 前言

在编程过程中,经常遇到文件读写操作,太频繁了。每次也都写的不一样。
突发奇想,想测试下几种不同的读取文件的效率。
测试以下三种方式读取文件效率:

  • 自定义读取文件耗时
  • 使用QFile类API读取文件耗时
  • 使用QTextStream类API读取文件耗时

在测试前,说一下使用到的知识点。

1. Qt读取文件

QFile类提供了一个读取和写入文件的接口。
QFile是一个读写文本、二进制文件和资源的I/O设备。QFile可以单独使用,但更多是与QTextStreamQDataStream一起使用。
QFile文件分隔符为’/‘,不分操作系统。不支持使用其他分隔符(例如’'),但可以使用"\\"
如:

QFile file("C:/User/Desktop/in.txt");

QFile file("C:\\User\\Desktop\\in.txt");

可以使用exists()检查文件是否存在,并使用remove()删除文件。(QFileInfoQDir是文件操作相关类)
文件用open()打开,用close()关闭,用flush()刷新。
size()返回文件的大小。可以使用pos()获取当前文件位置,或者使用seek()移动到新的文件位置。如果到达文件的末尾,atEnd()返回true。

QTextStream类为读取和写入文本提供了方便的接口。
QTextStream可以在QIODevice, QByteArrayQString上操作。使用QTextStream的流操作符,可以方便地读取和写入单词,行和数字。

以下是QFileQTextStream读取文件示例

1.1 QFile读取文件

QFile file("C:/User/Desktop/in.txt");
      if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
          return;

      while (!file.atEnd()) {
          QByteArray line = file.readLine();
  // toDoSomething
toDoSomething(line);
      }

以上代码:

  • 先创建一个QFile对象,在构造中设置文件路径
  • 设置打开模式,以只读和文件模式打开
  • 循环读取,当不是文件末尾时,读取行,返回字节数组QByteArray
  • 如果到达末尾,结束循环

1.2 QTextStream读取文件

QFile file("in.txt");
      if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
          return;
      // 创建文本流
      QTextStream in(&file);
      while (!in.atEnd()) {
          QString line = in.readLine();
  // toDoSomething
toDoSomething(line);
      }

以上代码:

  • 先创建一个QFile对象,在构造中设置文件路径
  • 设置打开模式,以只读和文件模式打开
  • 创建文本流,设置I/O设备
  • 循环读取,读取行,返回字符串QString
  • 如果到达末尾,结束循环

2. 自定义读取文件和使用系统API读取耗时对比

以下是三种方式,按行读取,测试所用耗时。
这个是打印函数:

void C_FileParse::printfTest(const int &nLineNum, const QString &ba)
{
    QString strInfo = QString("line : 第 %1 行, info : %2").arg(QString::number(nLineNum), ba);
    // qDebug().noquote() << strInfo;
}

2.1 方式一:自定义读取文件耗时

void C_FileParse::parse()
{
    QElapsedTimer timer;
    timer.start();
    QFile file(m_strFile);
    if(!file.open(QIODevice::ReadOnly))
    {
        return;
    }
    QTextStream in(&file);
    // 如果内容中有中文需要添加以下代码,不然含有中文时乱码
    in.setCodec(QTextCodec::codecForName("UTF-8"));
    QByteArray readInfo;
    int nLineNum = 1;
    while(!in.atEnd())
    {
        readInfo.append(in.read(m_nMaxSize));
        int nPosFind = 0;
        while(true) // 每次解析读到的m_nMaxSize数据
        {
            int nPosTmp = readInfo.indexOf("\r\n", nPosFind);
            if(-1 == nPosTmp) // 当没有找到以"\r\n"为分割的内容时,返回 -1
            {
                if(in.atEnd()) // 判断是否是最后一行
                {
                    // 最后一行,拿file的size() - 最后一个找到的下标nPosFind
                    QByteArray baRowInfo = readInfo.mid(nPosFind, file.size() - nPosFind);
                    // toDoSomething
                    // printfTest(nLineNum++, baRowInfo);
                }else{
                    // 获取非最后一行剩余的部分
                    readInfo = readInfo.right(readInfo.size() - nPosFind);
                }
                break;
            }

            // 获取行数据
            QByteArray baRowInfo = readInfo.mid(nPosFind, nPosTmp - nPosFind);
            // toDoSomething
            // printfTest(nLineNum++, baRowInfo);

            nPosFind = nPosTmp + QString("\r\n").size();
        }
    }
    file.close();
    qDebug().noquote() << "自定义解析:" << timer.elapsed();
}

2…2 方式二:使用QFile类API读取文件耗时

void C_FileParse::parse3()
{
    QElapsedTimer timer;
    timer.start();
    QFile file(m_strFile);
    if(!file.open(QIODevice::ReadOnly))
    {
        return;
    }

    int nLineNum = 1;
    while (!file.atEnd()) {
            // toDoSomething
            // printfTest(nLineNum++, baRowInfo);
    }
    file.close();
    qDebug().noquote() << "QFile自带API的解析:" << timer.elapsed();
}

2.3 方式三:使用QTextStream类API读取文件耗时

void C_FileParse::parse2()
{
    QElapsedTimer timer;
    timer.start();
    QFile file(m_strFile);
    if(!file.open(QIODevice::ReadOnly))
    {
        return;
    }
    QTextStream in(&file);
    // 如果内容中有中文需要添加以下代码,不然含有中文时乱码
    in.setCodec(QTextCodec::codecForName("UTF-8"));
    int nLineNum = 1;
    while (!in.atEnd()) {
            // toDoSomething
            // printfTest(nLineNum++, baRowInfo);
    }
    file.close();
    qDebug().noquote() << "QTextStream自带API的解析:" << timer.elapsed();
}

#3. 结果
调用:

    QString strFile ="C:/User/Desktop/in.txt";
    C_FileParse* pFileParse = new C_FileParse(strFile);

    QtConcurrent::run(pFileParse, &C_FileParse::parse);
    QtConcurrent::run(pFileParse, &C_FileParse::parse2);
    QtConcurrent::run(pFileParse, &C_FileParse::parse3);

image.png
由此可以得出:
还是使用QTextStream进行解析效率最高。
但如果是自定义解析格式,就得用第一种实现方式了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【BIAI】Lecture 5 - Auditory system

Lecture 5 - Auditory system 专业术语 auditory system 听觉系统 pinna 耳廓 auditory canal 耳道 tympanic membrane 鼓膜 cochlea 耳蜗 ossicles 听骨 auditory-vestibular nerve 前庭神经 oval window 椭圆窗 attenuation reflex 衰减反射 tensor tympani muscle 鼓膜张肌…

那些年听烂了的名词之“高可用“

那些年听烂了的名词之"高可用" 引言什么是可用性 ?哪些风险会影响系统的可用性 &#xff1f;如何应对这些风险&#xff0c;从而确保系统的可用性 &#xff1f;Phase: 设计做好容灾和多活处理做好容错设计做好资源隔离做好扩展性设计做好数据一致性处理 Phase: 预防做…

适配器Adapters

1.适配器作用 主要是对底层的东西进行改造 2.适配器种类&#xff1a;容器适配器&#xff0c;迭代器适配器&#xff0c;仿函数适配器 2.1容器适配器&#xff1a; stack&#xff0c;queue他们两的底层结构都为deque&#xff0c;deque有好多功能&#xff0c;而stack&#x…

如何将支持标准可观测性协议的中间件快速接入观测

前言 作为一名云原生工程师&#xff0c;如何将支持标准可观测性协议的中间件快速接入观测云呢&#xff1f;答案是只需要三步。 首先&#xff0c;需要确定您要观测的中间件类型。支持标准可观测性协议中间件可通过观测云的 DataKit 采集到中间件的关键指标。有些中间件自带可观…

文件系统与日志分析

一&#xff0c;文件系统 &#xff08;一&#xff09;inode 和block概述 1&#xff0c;文件数据包括元信息与实际数据 2&#xff0c;文件存储在硬盘上&#xff0c;硬盘最小存储单位是“扇区”&#xff0c;每个扇区存储512字节 3&#xff0c;block (块) 连续的八个扇区组成一…

Java常用类---包装类

包装类 包装类简介 Java语言是典型的面向对象编程语言&#xff0c;但是其中的8种基本数据类型并不支持面向对象编程&#xff0c;基本类型数据不具备"对象"的特性&#xff0c;即&#xff1a;没有携带属性以及没有方法可以调用。 为了解决上述问题&#xff0c;java为…

【Dubbo3高级特性】「微服务云原生架构」带你从零基础认识搭建公司内部服务用户中心体系(实战指南-01)

基础服务-用户中心 什么是用户中心&#xff1f; 用户中心&#xff0c;在我们的概念里面范围比较的广泛&#xff0c;包含了用户信息、账号信息以及租户信息的管理控制&#xff0c;在我们的总体设计里面&#xff0c;如果设计的边界较为紧密&#xff0c;也可以将权限的部分功能R…

poium测试库介绍

poium测试库前身为selenium-page-objects测试库&#xff0c;我在以前的文章中也有介绍过:这可能是最简单的Page Object库&#xff0c;项目的核心是基于Page Objects实现元素定位的封装。该项目由我个人在维护&#xff0c;目前在公司项目中已经得到的应用。 ### poium的优势 Pa…

Unity中URP下使用屏幕坐标采样深度图

文章目录 前言一、Unity使用了ComputeScreenPos函数得到屏幕坐标1、 我们来看一下这个函数干了什么2、我们看一下该函数实现该结果的意义 二、在Shader中使用&#xff08;法一&#xff09;1、在Varying结构体中2、在顶点着色器中3、在片元着色器中 三、在Shader中使用&#xff…

微信小程序实战-01翻页时钟-1

文章目录 前言需求分析功能设计界面设计界面结构设计界面样式设计 逻辑设计 单页功能实现运行结果 前言 我经常在手机上用的一款app有一个功能是翻页时钟&#xff0c;基于之前学习的小程序相关的基础内容&#xff0c;我打算在微信小程序中也设计一个翻页时钟功能&#xff0c;J…

高校教务系统登录页面JS分析——河北农业大学教务系统

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…

如何创建容器搭建节点

1.注册Discord账号 https://discord.com/这是登录网址: https://discord.com/ 2.点击startnow注册,用discord注册或者邮箱注册都可,然后登录tickhosting Tick Hosting这是登录网址:Tick Hosting 3.创建servers 4.点击你创建的servers,按照图中步骤进行

J2EE实验二

实验二 Struts2核心组件的应用 一、目的与任务 目的&#xff1a;学习Action中的动态方法调用和Action对Servlet API的三种访问方法&#xff0c;学习OGNL表达式和Struts2标签的使用 任务&#xff1a;实现基于Struts2的登录和注册系统&#xff0c;系统中练习使用Action、OGNL表…

SpringBoot项目处理 多数据源问题(把本地库数据 推送 到另外一个平台的库)

一、需求梳理 把我方数据库的表中数据 ----------> 推送到第三方的数据库 相当于库对库的数据插入, 但是需要的是用代码的方式实现; 二、解决思维 (1) 首先,平台与平台之间的数据库对接; 处理点1: 字段转换 (库表之间的数据字段不一致问题) 解决方式: 挨个字段的对应,如…

每日算法打卡:数的三次方根 day 7

文章目录 原题链接题目描述输入格式输出格式数据范围输入样例&#xff1a;输出样例&#xff1a; 题目分析示例代码 原题链接 790. 数的三次方根 题目难度&#xff1a;简单 题目描述 给定一个浮点数 n&#xff0c;求它的三次方根。 输入格式 共一行&#xff0c;包含一个浮…

【SpringCloud Alibaba笔记】(4)Seata处理分布式事务

Seata 分布式事务问题 单机单库没这个问题&#xff0c;分布式之前从1: 1 -> 1:N ->N:N 分布式之后 单体应用被拆分成微服务应用&#xff0c;原来的三个模块被拆分成三个独立的应用分别使用三个独立的数据源&#xff0c;业务操作需要调用三个服务来完成。 此时每个服务…

强化学习的数学原理学习笔记 - 蒙特卡洛方法(Monte Carlo)

文章目录 概览&#xff1a;RL方法分类蒙特卡洛方法&#xff08;Monte Carlo&#xff0c;MC&#xff09;MC BasicMC Exploring Starts&#x1f7e6;MC ε-Greedy 本系列文章介绍强化学习基础知识与经典算法原理&#xff0c;大部分内容来自西湖大学赵世钰老师的强化学习的数学原理…

Hive 的 安装与部署

目录 1 安装 MySql2 安装 Hive3 Hive 元数据配置到 MySql4 启动 Hive Hive 官网 1 安装 MySql 为什么需要安装 MySql? 原因在于Hive 默认使用的元数据库为 derby&#xff0c;开启 Hive 之后就会占用元数据库&#xff0c;且不与其他客户端共享数据&#xff0c;如果想多窗口操作…

强化学习6——动态规划置策略迭代算法,以悬崖漫步环境为例

策略迭代算法 通过策略评估与策略提升不断循环交替&#xff0c;得到最优策略。 策略评估 固定策略 π \pi π 不变&#xff0c;估计状态价值函数V 一个策略的状态价值函数&#xff0c;在马尔可夫决策过程中提到过&#xff1a; V π ( s ) ∑ a ∈ A π ( a ∣ s ) ( r (…