fstream与 C 风格(例如fread 和 fwrite )两种读写文件方法的效率比较
我觉得作者写的挺好,评论也写的很对。
目前我的项目就是在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()的将近十倍! (此结论惊人!)
- 2楼 Azrael_Shiki 2011-07-12 13:29发表 [回复]
-
-
你的结论的确惊人。
看看我用你的代码在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上,编译器也多的是。多测几个再看看吧,相信你会有新的发现。
- 1楼 fjnu123012007003 2011-03-10 18:13发表 [回复]
-
- C++的输入输出不要告诉其数据类型,而是采用重载实现的,这个当然比C耗时了。C在读取的时候,都有格式控制符来告诉数据类型的。一般来说,gets比scanf快,scanf比cin快。
转载:http://blog.csdn.net/tyt2222008/article/details/6088489
fstream与 C 风格(例如fread 和 fwrite )两种读写文件方法的效率比较相关推荐
- PHP中两种包含文件方式、三种注释风格、四种标记风格
2019独角兽企业重金招聘Python工程师标准>>> 一.两种包含文件的方式 ①require语法格式:require("文件名"):这个函数通常放在PHP程序 ...
- 用fread()和fwrite()读写文件
ANSI C文件系统提供fread()和fwrite()两个函数,用于读/写长于一字节的数据类型.这两个函数允许读/写各种类型的数据块.它们的原型是: size_t fread(void *buffe ...
- fwrite函数Matlab,fread和fwrite函数,C语言fread和fwrite函数详解
对文件格式化读写函数 fprintf 与 fscanf 而言,尽管它可以从磁盘文件中读写任何类型的文件,即读写的文件类型可以是文本文件.二进制文件,也可以是其他形式的文件.但是,对二进制文件的读写来说 ...
- C语言 fread()与fwrite()函数说明与示例
1.作用 读写文件数据块. 2.函数原型 (1)size_t fread ( void * ptr, size_t size, size_t count, FILE * stream ); 其中,pt ...
- 【C 语言】文件操作 ( 使用 fread 和 fwrite 实现二进制文件的拷贝 | stat 统计文件大小 | feof 判定文件结尾 )
文章目录 一.stat 统计文件大小 二.feof 判定文件结尾 三.使用 fread 和 fwrite 实现二进制文件的拷贝 一.stat 统计文件大小 统计文件大小 , 需要借助 stat 结构体 ...
- 文件操作:fread()和fwrite()
fread和fwrite函数功能 用来读写一个数据块. 一般调用形式 fread(buffer,size,count,fp); fwrite(buffer,size,cou ...
- fread和fwrite函数功能
fread和fwrite函数功能 用来读写一个数据块. 一般调用形式 fread(buffer,size,count,fp); fwrite(buffer,size,count,fp); ...
- Fread 和fwrite的参数不同,返回值不同
函数fwrite 功能 C语言函数,向文件写入一个数据块 . size_t fwrite(const void* buffer, size_t size, size_t count, FILE* ...
- fread、fwrite、fopen函数的简单使用和open、read、write区别解析
这几个函数的区别:fread.fwrite.fopen和open.read.write区别解析 标准C库函数的简单使用 fopen函数原型: #include <stdio.h> FILE ...
最新文章
- .net 将html写成的table 转换成excel_如何使用Pandas将二维表(DataFrame)反转为一维列表?...
- C++利用二次探查实现存储机制hash table的算法(附完整源码)
- 一个C++程序员生产力,大概相当20个C程序员,200个java程序员?
- mouseover和mouseenter的区别
- Android-HelloWorld
- [JNI] 开发基础(7)结构体
- apktool + dex2jar + xjad反编译apk文件
- 贝叶斯公式的理解——机器学习算法(一)
- YYText的介绍和使用
- 全网首发stm8s的硬件I2C读取bme280(bmp280)的C源程序
- nextjs的发布,pm2发布nextjs项目
- 自定义设置HTTP响应头
- 在Word中,如何删除页眉页脚
- mysql error code: 1205_Mysql错误:ERROR 1205 (HY000): Lock wait timeout exceeded解决办法
- 阿里云Centos7服务器域名解析和Nginx配置
- Okhttp之Https
- mmseg底层代码分析及修改
- mysql游标 循环_MySQL游标循环问题?
- 优知学院总结之Mysql面试
- 点波地图css,沙漠地图,提波镇点位玩法攻略