`
qimo601
  • 浏览: 3444110 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

QFile和C语言对文件操作的性能比较.--读取double型二进制数据文件

    博客分类:
  • Qt
阅读更多

关键问题在于:QFile读取double型二进制数据流,只有两种方法处理数值。

 

一是通过QDataStream一个一个double读取,存储在一个QVector<double>中

二是通过QFile read(int len) 返回在一个QByteArray中,然后对这个QByteArray进行QDataStream序列化读取。

 

问题就出现在这个序列化读取中,这种需要循环读取值,耗费了大量时间。

不如C语言的一句size_t fread(    void* buffer,    size_t size,    size_t count,    FILE* stream );能迅速的读取进入一个Double[]数组中,时间消耗差距是几十倍。

 

 

可以细看下面两类代码,看看他们的时间消耗。

 

/**
 *函数介绍:读取裸数据文件
 *输入参数:无
 *返回值:  无
 */
void RawData::readNakedDataFile()
{
    QList< QVector<float> * > dataList;
    QList< float * > listList;
    QTime t;
    double  duration;
    FILE *stream;
    QFile file("NakedData/nakedData.raw");
    if (!file.open(QIODevice::ReadOnly))
        return;
    QDataStream in(&file);
    in.setVersion(QDataStream::Qt_4_6);
    in.setByteOrder(QDataStream::LittleEndian);
    in.setFloatingPointPrecision(QDataStream::SinglePrecision);
    float m = 0;
    t.start();
    qDebug() << "时间1:" <<t.currentTime().toString("hh:mm:ss.zz");
    for(int i = 0;i < 2; i++)
    {

        QVector<float>  *data = new QVector<float>();
        for(int j = 0; j <1152*16; j++)
        {
            in >> m ;
            data->append(m);
            //qDebug() <<"输出:"<< m << "" << j;
        }

        dataList.append(data);
    }
    duration = t.elapsed();
    qDebug() << "时间2:" <<t.currentTime().toString("hh:mm:ss.zz");
    qDebug() << "时间"  <<duration;
    file.close();

    ////***********C fread 读取成功************//
    //float list[16*1152];
    if( fopen_s( &stream, "NakedData/nakedData.raw", "r+b" ) !=NULL )
        return;
    t.restart();
    qDebug() << "时间1:" <<t.currentTime().toString("hh:mm:ss.zz");

    for(int i = 0; i < 2; i ++)
    {

        float * list = new float[1152*16];
        fread( list, sizeof(float), 1152*16, stream );
        //for(int i = 0; i < 16*1152;i++)
        //qDebug() << list[i] << "" << i;
        listList.append(list);
    }
    qDebug() << "时间2:" <<t.currentTime().toString("hh:mm:ss.zz");
    duration = t.elapsed() ;
    qDebug() << "时间" <<duration;
    fclose(stream);
	//打印两种读取结果,判断是否一致
    //for(int i = 0; i < 2; i ++)
    //{
    //    QVector<float> *dataVector = dataList.at(i);
    //    float * list = listList.at(i);
    //    for(int j = 0; j < 1152*16; j++)
    //    {
    //        qDebug() <<"data:["<<i<<"]["<< j <<"]"<<dataVector->at(j) ;
    //        qDebug() <<"list:["<<i<<"]["<< j <<"]"<< *(list++) ;
    //    }
    //}
}

 

 

当循环中的i2圈的时候,消耗时间分别为 ms

 

当循环中的i10圈的时候,消耗时间分别为 ms

 

当循环中的i100圈的时候,消耗时间分别为 ms

 

当循环中的i1000圈的时候,消耗时间分别为 ms

 

 

=============下面调整一下Qt读取文件的方法====================

 

/**
 *函数介绍:读取裸数据文件
 *输入参数:无
 *返回值:  无
 */
void RawData::readNakedDataFile()
{
    QList< QVector<float> * > dataList;
    QList< float * > listList;
    QTime t;
    double  duration;
    FILE *stream;
    QFile file("NakedData/nakedData.raw");
    if (!file.open(QIODevice::ReadOnly))
        return;
    float m = 0;
    t.start();
    qDebug() << "时间1:" <<t.currentTime().toString("hh:mm:ss.zzz");
    for(int i = 0;i < 4; i++)
    {
        QByteArray array = file.read(1152*16*4);
        QDataStream in(&array,QIODevice::ReadOnly);
        in.setVersion(QDataStream::Qt_4_6);
        in.setByteOrder(QDataStream::LittleEndian);
        in.setFloatingPointPrecision(QDataStream::SinglePrecision);
        QVector<float>  *data = new QVector<float>();
        for(int j = 0; j <1152*16; j++)
        {
            in >> m ;
            data->append(m);
        }

        dataList.append(data);
    }
    duration = t.elapsed();
    qDebug() << "时间2:" <<t.currentTime().toString("hh:mm:ss.zzz");
    qDebug() << "时间"  <<duration;
    file.close();

    ////***********C fread 读取成功************//
    //float list[16*1152];
    if( fopen_s( &stream, "NakedData/nakedData.raw", "r+b" ) !=NULL )
        return;
    t.restart();
    qDebug() << "时间1:" <<t.currentTime().toString("hh:mm:ss.zzz");

    for(int i = 0; i < 4; i ++)
    {

        float * list = new float[1152*16];
        fread( list, sizeof(float), 1152*16, stream );
        listList.append(list);
    }
    qDebug() << "时间2:" <<t.currentTime().toString("hh:mm:ss.zzz");
    duration = t.elapsed() ;
    qDebug() << "时间" <<duration;
    fclose(stream);


    for(int i = 0; i < 4; i ++)
    {
        QVector<float> *dataVector = dataList.at(i);
        float * list = listList.at(i);
        for(int j = 0; j < 1152*16; j++)
        {
            qDebug() <<"data:["<<i<<"]["<< j <<"]"<<dataVector->at(j) ;
            qDebug() <<"list:["<<i<<"]["<< j <<"]"<< *(list++) ;
        }
    }
}

 

 

当循环中的i0圈的时候,消耗时间分别为 ms

当循环中的i10圈的时候,消耗时间分别为 ms

当循环中的i100圈的时候,消耗时间分别为 ms

当循环中的i1000圈的时候,消耗时间分别为 ms

 

 

分享到:
评论

相关推荐

    QT开发-文件(所有)读取-转二进制

    总的来说,通过使用QT的`QFile`和`QByteArray`,我们可以方便地读取和显示文件的二进制内容,这对于理解和处理二进制数据至关重要。这个过程涉及到文件I/O操作、数据类型转换以及字符串处理,是QT开发中的常见技能。

    Qt 读取16进制的data文件

    在IT领域,特别是软件开发中,Qt是一个非常流行的开源跨平台应用...通过结合`QFile`和`QDataStream`,开发者能够轻松地读取和解析各种格式的数据文件。对于新手而言,理解这些基本概念和API是进入Qt开发的重要一步。

    QT一二进制形式读取图片

    5. **读取和写入二进制数据**:使用QIODevice的read()和write()函数,我们可以将图像数据从内存中的QImage对象读取出来,或者将二进制数据写入到文件中。这两个函数都接受一个uchar(无符号字符)指针和一个大小参数...

    Qt QFile读取文件列数据.rar

    在Qt库中,QFile是一个核心的类,用于处理本地文件。这个压缩包"Qt QFile读取文件列数据....实际应用中,根据具体的数据格式和需求,可能需要扩展这些基础方法,例如,添加对其他分隔符的支持,或者处理二进制文件等。

    Qt 基于QFile 读写ini文件(包含QFile读取行,修改行数据,删除行数据)

    在Qt框架中,QFile类是用于处理本地文件的基础组件,它可以用来读取、写入和操作文件。本文将深入探讨如何使用QFile配合其他工具类来读取、修改和删除ini配置文件中的数据,以替代QSettings在某些场景下的不便。 ...

    Qt实现GUI的二进制文件读写操作(源码分析+工程打包+测试例子)

    在处理二进制文件时,我们通常需要高效地读取和写入大量数据,例如图像、音频或自定义格式的数据结构。 首先,让我们看看在Qt中进行二进制文件读写的API。Qt提供了`QFile`类来处理文件操作,包括读取和写入。对于二...

    QT打开二进制文件,串口分包定时发送

    2. **二进制文件操作**:在QT中,可以使用QFile类来处理文件,包括读取和写入二进制文件。QFile::open()函数用于打开文件,然后QFile::read()可以用来读取二进制数据,这些数据通常会被转换成QByteArray对象,以便...

    QT打开二进制文件,串口分包定时发送,qt串口发送数据,QT源码.zip.zip

    2. **二进制文件操作**:在QT中,可以使用QFile类来处理文件,包括二进制文件。QFile::open()函数用于打开文件,传入QIODevice::ReadOnly或QIODevice::WriteOnly标志以指定读写模式。读取二进制文件时,可以使用...

    Qt开发教程二进制文件基础操作讲解.docx

    文本文件主要包含人类可读的文字信息,而**二进制文件**则是指除文本文件之外的其他类型文件,它们通常包含特定格式的数据,比如图像、音频、视频等多媒体文件,以及特定应用的数据文件。 二进制文件中的数据是以...

    【QT】 19 QFile文件读取/QFileInfo文件信息

    在QT编程中,QFile和QFileInfo是两个非常重要的类,它们主要用于文件的读取和文件信息的获取。本文将详细讲解这两个类的功能、用法以及如何在实际开发中应用。 首先,QFile是QT库中的一个核心组件,用于处理本地...

    Qt-读写二进制文件(数据结构)

    本文将深入探讨如何使用Qt的QDataStream类来实现二进制文件的读写操作,并结合自定义数据结构`AccountInfo`进行演示。 首先,二进制文件相比于文本文件具有诸多优势。它们占用的磁盘空间更小,因为二进制文件不包含...

    QT读取二进制文件(可拖拽文件)

    在QT编程环境中,读取二进制文件是一项常见的任务,特别是在处理图像、音频或自定义数据格式时。本文将深入探讨如何使用QT框架来实现这一功能,并特别关注如何使程序支持用户通过拖放操作来加载文件。 首先,我们...

    QT实现HEX文件操作

    HEX文件操作涉及到对这类文件的读取、写入和解析等基本功能。下面将详细讨论QT如何实现HEX文件操作,并结合提供的资源,如《HEX文件格式解析.pdf》和源码工程,探讨相关知识点。 首先,了解HEX文件格式至关重要。...

    本代码使用Qt读取bin文件中的数据

    在软件开发过程中,二进制(bin)文件是一种常见的数据存储格式,它能够高效地存储各种类型的数据,包括但不限于文本、图像、音频等。Qt作为一款跨平台的应用程序开发框架,提供了强大的工具集来处理这类文件。 ###...

    QT二进制文件读写应用程序示例

    Qt使用QFile和QDataStream进行二进制数据文件的读写。QFile负责文件的IO设备接口,即与文件的物理交互,QDataStream以数据流的方式读取文件内容或写入文件内容。 本节以实例samp7_2演示二进制文件的读写.

    qt-例程-Excel十进制转为26进制.7z

    1. **数据读取**:首先,程序会使用Qt的QFile或QTextStream类读取Excel文件。Qt没有内置的Excel文件处理功能,但可以借助外部库如QAxObject(ActiveQt)或者更现代的QCustomOrm等来与Excel交互。 2. **数据解析**:...

    QT 文件读取和写入

    文件读取操作 文件读取同样涉及到几个关键步骤: - **创建文件对象**:与写入类似,使用`QFile`类创建一个文件对象。 - **打开文件**:这次是采用只读模式`QIODevice::ReadOnly`和文本模式`QIODevice::Text`。 - **...

    Qt File读取txt文件数据并用QChart绘制曲线

    在Qt框架中,QFile和QChart是两个重要的模块,分别用于文件操作和图表绘制。本教程将深入探讨如何利用这两个模块从txt文件中读取数据,并将其转换为图形,特别是绘制曲线图。 首先,我们需要了解`QFile`类。它是Qt...

    Qt文件操作详解(创建、写入、删除、INI、XML文件等) - 左霖风的博客 - CSDN博客1

    在Qt框架中,进行文件操作是非常常见的任务,包括创建、写入、删除文件以及处理特定格式如INI和XML文件。以下是对这些操作的详细说明: 1. 创建文件夹: 要创建一个新的文件夹,可以使用`QDir`类。首先包含头文件`...

Global site tag (gtag.js) - Google Analytics