首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-08-25 
QFile和C语言对文件操作的性能比较.--读取double型二进制数据文件关键问题在于:QFile读取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++) ;    //    }    //}}

?

?

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

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

?

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

?

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

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

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

?

当循环中的i为1000圈的时候,消耗时间分别为?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++) ;        }    }}

?

?

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

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

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

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

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

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

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

?

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

?

热点排行
Bad Request.