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
QFile和C语言对文件操作的性能比较.--读取double型二进制数据文件相关推荐
- python二进制文件 删除尾部数据_在Python中读取和切片二进制数据文件的最快方法...
我有一个处理脚本,用于提取"uint16"类型的二进制数据文件,并一次以6400块的形式进行各种处理.该代码最初是用Matlab编写的,但由于分析代码是用 Python编写的,我们 ...
- c语言读取文件函数,C语言文件操作详细分析:读取文件(fread函数使用)
C语言文件操作详细分析:读取文件(fread函数使用) 这里详细介绍了C语言读取文件的函数fread的使用说明,参照了MSDN的说明,同时加入自己的经验让大家学的更加明白. C语言读取文件函数frea ...
- 【Unity3D读取数据】(四)Excel文件操作(创建、读取、写入、修改)
推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...
- 【Unity3D读取数据】(二)Json文件操作(创建、读取、解析、修改)
推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...
- matlab 十六进制数组,【MATLAB】MATLAB中读取二进制数据文件并加入到矩阵中
MATLAB中读取二进制数据文件并加入到矩阵中的应用如下: 如果对c语言十分熟悉的话,应该对fopen,fclose,ftell,fseek,fread,fwrite,feof 这些函数非常熟悉了,在 ...
- c++读取txt文件中的数字_在Python中读取包中的数据文件的三种方式
我们知道,写Python代码的时候,如果一个包(package)里面的一个模块要导入另一个模块,那么我们可以使用相对导入: 假设当前代码结构如下图所示: 其中test_1是一个包,在util.py里面 ...
- Matlab读取二进制数据文件
第一步:函数fopen打开文件 fid=fopen('文件名',读取方式) fid:句柄值 小于0表示打开失败:大于0表示打开成功 文件名:字符串,使用单引号(本文例子'savedata.dat') ...
- IOS 读二进制数据文件
IOS 读二进制数据文件 在开发项目的过程中,我们有可能遇到上面这图片展示的数据.其实这些数据是存放到文件中的二进制数据.记得大学的时候老师带着我们写了一个记账类软件,当时就是把账单里面的数据存放到文 ...
- python怎么读取txt文件并统计其字数-python读写excel等数据文件方法汇总
python处理数据文件第一步是要读取数据,文件类型主要包括文本文件(csv.txt等).excel文件.数据库文件.api等. 下面整理下python有哪些方式可以读取数据文件. 1. python ...
最新文章
- php无极分类非递归_无限极分类算法,对你一定有帮助
- 社交网站将推动手游发展
- pyppeteer:比selenium更高效的爬虫利器
- php sql 长字符串 查找被包含的短字符串_PHP字符串
- vue element form 表单
- 大数据分析给企业带来哪些挑战
- 【面经】腾讯NLP实习面经(Offer已拿)
- Atitit doc mng 文档管理总结目录1. 主要几大内容 12. 存储管理 22.1. 一般来说 ,文档存储在IM网盘note邮箱blog wiki等地 22.2. 文档格式与体
- Mac下Chrome添加.crx浏览器插件
- SanDisk cz48 16G TLC U盘量产经验分享
- LabVIEW编程LabVIEW控制cRIO-9043例程与相关资料
- 计算机键盘没有fn,教您fn键设置方法
- 2021-2022 文旅市场研报与文旅策划案例(共80份)
- Echart3绘制世界地图连线中国城市
- 006 window7或虚拟机上不了网或DNS出问题
- CSS 滚动快照 Scroll Snap
- CorelDRAW苹果水晶球详细制作
- 介绍Jackson JsonParser解析json
- 邮箱POP3、SMTP和IMAP
- skywalking
热门文章
- Hive SemanticException
- IDEA部署项目和多余的项目删掉的演示
- 冒泡排序、递归、二分查找
- WindowServer2003中IIS6.0允许运行32位程序
- C#中的矩阵转换,应用.net GDI+
- mapreduce与spark的区别--内容详细
- 【Scala】Scala中特殊函数的使用(代码)
- app 怎么通过jmeter 进行性能测试
- tcp滑动窗口_面试必备TCP(三):滑动窗口
- C语言1013山东理工大学试题,山东理工大学史上最全C语言PPTC程序设计(2基本数据与运算).ppt...