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