- 浏览: 3416159 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
sonichy:
Qt5改动很多,要改改了。
基于QItemDelegate的例子1 SpinBoxDelegate -
我的主页6:
楼主,2.2子查询的分页方式:SELECT * FROM ar ...
Mysql 分页语句Limit用法 -
liguoqi:
非常感谢楼主的用心指导,工具以及图片例子都提供了 赞!
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
问下这个图片怎么解压损坏呀
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
楼主讲解的非常详细,还附带工具和图片例子,非常感谢
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载
我觉得作者写的挺好,评论也写的很对。
目前我的项目就是在VS2008+Qt+win7上开发的。我上次总结的QFile和C语言对文件操作的性能比较.--读取double型二进制数据文件也说明了这个问题。
在windows平台下,MSVC编译器的环境下,对大文件的数据读写操作。采用C语言的形式(例如fread 和 fwrite )确实比C++/QT的串行序列化读写文件,速度快上好几倍。可以参考这两篇文章。
1、QFile和C语言对文件操作的性能比较.--读取double型二进制数据文件
2、fstream与 C 风格(例如fread 和 fwrite )两种读写文件方法的效率比较
转载:
为了探录c++ 风格的fstream与 C 风格(例如fread 和 fwrite )两种读写文件的方法的效率,我特意做了两个实验。
我的机器是Windows XP, Visual Studio 2008
1. 测试写文件速度
程序设计思路: 将TEST_SIZE个字符用两种方式写入文件,记录两种方式的耗时。
实验代码:
[cpp] view plaincopy
- void test_write()
- {
- const int TEST_SIZE = 10000000 ;
- const char* c_plus_write_file = "H://c_plus_write_file.txt";
- const char* c_write_file = "H://c_write_file.txt";
- cout<<"Test size :" << TEST_SIZE <<endl;
- //c++ style writing file
- ofstream of(c_plus_write_file);
- assert(of);
- time_t start, end;
- start = clock();
- for(int i=0; i < TEST_SIZE; ++i)
- {
- char tmp[1];
- tmp[0] = char(i);
- of << tmp[0];
- }
- end = clock();
- of.close();
- cout<<"C++ style: "<<end - start <<" ms"<<endl;
- //c style writing file
- FILE* fp = fopen(c_write_file, "w");
- start = clock();
- for(int i=0; i < TEST_SIZE; ++i)
- {
- char tmp[1];
- tmp[0] = char(i);
- fwrite( tmp, 1, 1, fp);
- }
- end = clock();
- fclose(fp);
- cout<<"C style: "<<end - start <<" ms"<<endl;
- cin.get();
- }
实验结果:
图1
图2
图3
**从图1、2、3,可以看出, ofstream 的 << 运算符 所耗时 是fwrite()的近三倍
把of<<的代码改成了: of.write(tmp,1); 后结果:
实验代码:
- void test_write()
- {
- const int TEST_SIZE = 1000000 ;
- const char* c_plus_write_file = "H://c_plus_write_file.txt";
- const char* c_write_file = "H://c_write_file.txt";
- cout<<"Test size :" << TEST_SIZE <<endl;
- //c++ style writing file
- ofstream of(c_plus_write_file);
- assert(of);
- time_t start, end;
- start = clock();
- for(int i=0; i < TEST_SIZE; ++i)
- {
- char tmp[1];
- tmp[0] = char(i);
- of.write(tmp,1);
- }
- end = clock();
- of.close();
- cout<<"C++ style: "<<end - start <<" ms"<<endl;
- //c style writing file
- FILE* fp = fopen(c_write_file, "w");
- start = clock();
- for(int i=0; i < TEST_SIZE; ++i)
- {
- char tmp[1];
- tmp[0] = char(i);
- fwrite( tmp, 1, 1, fp);
- }
- end = clock();
- fclose(fp);
- cout<<"C style: "<<end - start <<" ms"<<endl;
- cin.get();
- }
实验结果:
图4
图5
图6
对比图4 和 图1、 图5 和 图2、图6 和 图3, 可以看到 << 运算符没有 ofstream.write(), 快, 但两者还是没有 fwrite() 快
结论: 效率 fwrite() > ofstream.operator<<() > ofstream.write()
3. 下面做读文件的比较:
程序设计思路: 用两种方法去读一个近100M的文本,记录时间。
实验代码:
- void test_read()
- {
- const char* read_file = "H://read4.txt";
- const int BUF_SIZE = 1024 ;
- char buf[BUF_SIZE];
- //c++ style writing file
- ifstream ifs(read_file,ios::binary);
- assert(ifs);
- time_t start, end;
- start = clock();
- while(!ifs.eof())
- {
- ifs.read(buf,BUF_SIZE);
- }
- end = clock();
- ifs.close();
- cout<<"C++ style: "<<end - start <<" ms"<<endl;
- //c style writing file
- FILE* fp = fopen(read_file, "rb");
- start = clock();
- int len = 0;
- do
- {
- len = fread(buf,1,BUF_SIZE,fp);
- //cout<<len<<endl;
- }while(len != 0);
- end = clock();
- fclose(fp);
- cout<<"C style: "<<end - start <<" ms"<<endl;
- cin.get();
- }
实验结果:
图7
结论: 读取一个 100M 的文件, fread() 的效率 是 ifstream.read()的将近十倍! (此结论惊人!)
看看我用你的代码在MinGW的g++上的测试结果:
Test text-style writing:
Test size :10000000
C++ style: 718 ms
C style: 1594 ms
Test binary-style writing:
Test size :1000000
C++ style: 63 ms
C style: 156 ms
Test reading:
C++ style: 1047 ms
C style: 609 ms
结果是输出时C++风格比C风格还快,就算是输入C++风格也只花了C风格不到一半的时间。看看你我结果的对比能说明什么(硬件不同所以绝对数值没有可比性,只有同一平台上的对比才有意义)?
只能说明M$VC的C++ I/O是多么的Disabled(翻译成无能还是残疾随你便),奉劝你不要只在M$VC平台上发现了什么就以偏概全地说A比B快云云,就算在M$WIN上,编译器也多的是。多测几个再看看吧,相信你会有新的发现。
转载:http://blog.csdn.net/tyt2222008/article/details/6088489
发表评论
-
C++ 实现把非静态成员函数作为回调函数(非static)
2012-11-16 10:10 14422众所周知,C++的类成员函数不能像普通函数那样用于回调,因 ... -
【转】windows多线程CreateThread与_beginthreadex本质区别
2012-11-15 14:40 13752本文将带领你与多线程作第一次亲密接触,并深入分析Crea ... -
windows下C语言多线程编程
2012-11-15 14:37 9946_beginThreadex创建多线程解读 一、需 ... -
ostringstream 的清空数据方法
2012-09-27 15:28 19255关于C++中 <sstream>中ostrings ... -
输入参数和输出参数
2012-09-26 10:43 36001. 输入参数,是函数的调用者,传递给函数的实现者,对函 ... -
ofstream、ifstream、fstream
2012-09-23 19:23 2842学习一下C++的文件流: ofstream是从内 ... -
将ostream 对象转换成字符串流输出
2012-09-22 10:47 8530将ostream 对象转换成字符串流输出 因为项目中需 ... -
sstream和strstream以及fstream
2012-09-22 10:38 4352在C++有两种字符串流,也称为数组I/O流,一种在sstre ... -
字符串流 ostrstream 和 istrstream
2012-09-22 10:28 7859ostrstream类流 /*ostrst ... -
将有格式的int解析成float
2012-09-20 18:10 2215因项目中有一个需求:将采集到所有short int 转换成fl ... -
回调函数测试例子
2012-09-29 14:15 4242回调函数就是一个通过函数指针调用的函数。如果你把函数的指 ... -
fatal error C1083: Cannot open include file: 'iostream.h': No such file or dire
2012-09-20 17:19 6335错误: fatal error C1083: Cannot o ... -
C++中类的声明
2012-08-29 16:28 6891可以声明一个类而不定义它 class Sc ... -
only static const integral data members can be initialized within a class
2012-06-28 11:40 2686翻译一下:只有静态整型常量数据成员能在类中初始化 ... -
C/C++快速写入类结构对象进入文件
2012-06-19 10:38 0void QObject::deleteLater() { ... -
C语言文件操作函数大全
2012-06-18 13:54 2305C语言文件操作函数大 ... -
C++ 动态申请数组
2012-06-09 00:05 6650方法1、C++使用vector方便 ... -
VC++动态链接库(DLL)编程深入浅出(ZZ)
2012-06-08 10:06 23841.概论 先来阐述一下DLL(Dynamic Link ... -
C++中的头文件和源文件
2012-05-09 14:54 6555一、C++编译模式 通常 ... -
C语言下,获取文件信息
2012-05-08 15:07 6625C语言下,如何获取文件的生成时间,日期和文件大小等文件信息。 ...
相关推荐
在编程总经常会用到读写文件,基本都是使用ofstream,ifstream,fstream
C++ iostream对文件流操作,实现文件读写,简单方便。
C语言头文件 FSTREAM.HC语言头文件 FSTREAM.HC语言头文件 FSTREAM.HC语言头文件 FSTREAM.HC语言头文件 FSTREAM.HC语言头文件 FSTREAM.HC语言头文件 FSTREAM.HC语言头文件 FSTREAM.HC语言头文件 FSTREAM.HC语言头文件...
C++_fstream的使用方法,ifsream,ofstream
c++ 文件操作 fstream ifstream ofstream
数据用二进制方式保存无疑是能减小数据文件体积!此类就是鉴此思想编写 类包括数据写入 读写(文件头(结构体)部分 记录数据基本参数和文件的数据块数量 正文部分为存数据(结构体))高效实现块写 块读 !
C++中的文件读写可以使用标准库中的iostream库来完成。下面是描述如何进行格式化的文件读写的步骤,不包含具体的代码实现: 包含头文件:在程序中包含iostream头文件,以便使用输入输出流。 打开文件:使用fstream...
C语言头文件 FSTREAMC语言头文件 FSTREAMC语言头文件 FSTREAMC语言头文件 FSTREAMC语言头文件 FSTREAMC语言头文件 FSTREAMC语言头文件 FSTREAMC语言头文件 FSTREAMC语言头文件 FSTREAMC语言头文件 FSTREAMC语言...
传统的文件 I/O 库如 Unix 的 <io.h> 和 <stdio.h> ,由于其程序接口的原因,在很大程度上强制程序员进行某些处理,缺乏类型安全和国际化支持。C++ 的 <fstream> 库则在文件的 I/O 方面提供了一个增强的、面向对象的...
在Windows平台对文件进行存取操作可选的方案有很多,... fstream有两个派生类,即ifstream和ofstream,分别对应输入文件流、输出文件流。在使用它们之前,必须将它们的头文件包含到你的cpp文件中。创建一个文件流的方
事实上, <iostream.h> 已经被<fstream.h>包含了, 所以你不必包含所有这两个文件, 如果你想显式包含他们,那随便你。我们从文件操作类的设计开始, 我会讲解如何进行ASCII I/O操作。如果你猜是"fstream," 恭喜你答对...
C++ fstream文件流读 中字符串string与b VB ListView控件各种
c++读写文本文件,实现对文件的读和取操作,用到了fstream流的概念。
该源码来自于我做的实际工程项目,绝不含bug及其他不厚道的改动,拿来就可用!希望对其他有这方面应用的众...fstream 读.CLD二进制码流 生成.raw,.txt等文件; 读.tfw,.tiff文件; fsteam 写回不加密的.CLD二进制文件
fstream 继承 iostream; fstream 拥有iostream功能,但并不是包含关系 fstream 是对文件操作 而 iostream 是 对 标准输入输出文件的操作
本文介绍了对文本文件、二进制文件的读写打开关闭等操作,以及fstream、 ifstream、ofstream的使用及方法。
fstream c++ fstream类详解
<fstream> 文件的I/O库提供了ANSI C的很多有用的优点,包括面向对象的界面,国际化和地方化的支持,安全性能,以及简单的调试
本代码封装使用了fstream进行文件的读写如有错误请指正
如果你的fstream.h文件缺失,或者出了问题,可以直接下载这个文件,编程常用