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

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

关键问题在于: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

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

 

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

 

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

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

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

 

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

 

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

=============下面调整一下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

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

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

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

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

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

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

 

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