`
qimo601
  • 浏览: 3416159 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

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

  1. void test_write()  
  2. {     
  3.     const int TEST_SIZE = 10000000 ;  
  4.     const char* c_plus_write_file = "H://c_plus_write_file.txt";  
  5.     const char* c_write_file = "H://c_write_file.txt";  
  6.       
  7.     cout<<"Test size :" << TEST_SIZE <<endl;  
  8.     //c++ style writing file  
  9.     ofstream of(c_plus_write_file);  
  10.     assert(of);  
  11.     time_t start, end;  
  12.     start =  clock();  
  13.     for(int i=0; i < TEST_SIZE; ++i)  
  14.     {  
  15.         char tmp[1];  
  16.         tmp[0] = char(i);  
  17.         of << tmp[0];  
  18.     }  
  19.     end = clock();  
  20.     of.close();  
  21.     cout<<"C++ style: "<<end - start <<" ms"<<endl;  
  22.     //c style writing file  
  23.     FILE* fp = fopen(c_write_file, "w");  
  24.     start =  clock();  
  25.     for(int i=0; i < TEST_SIZE; ++i)  
  26.     {  
  27.         char tmp[1];  
  28.         tmp[0] = char(i);  
  29.         fwrite( tmp, 1, 1, fp);  
  30.     }  
  31.     end = clock();  
  32.     fclose(fp);  
  33.     cout<<"C style: "<<end - start <<" ms"<<endl;  
  34.     cin.get();  
  35. }  
 

 

 

实验结果:

图1

图2

图3

 

**从图1、2、3,可以看出, ofstream 的 << 运算符 所耗时 是fwrite()的近三倍

 

 

of<<的代码改成了: of.write(tmp,1); 后结果:

 

 

实验代码:

  1. void test_write()  
  2. {     
  3.     const int TEST_SIZE = 1000000 ;  
  4.     const char* c_plus_write_file = "H://c_plus_write_file.txt";  
  5.     const char* c_write_file = "H://c_write_file.txt";  
  6.       
  7.     cout<<"Test size :" << TEST_SIZE <<endl;  
  8.     //c++ style writing file  
  9.     ofstream of(c_plus_write_file);  
  10.     assert(of);  
  11.     time_t start, end;  
  12.     start =  clock();  
  13.     for(int i=0; i < TEST_SIZE; ++i)  
  14.     {  
  15.         char tmp[1];  
  16.         tmp[0] = char(i);  
  17.         of.write(tmp,1);  
  18.     }  
  19.     end = clock();  
  20.     of.close();  
  21.     cout<<"C++ style: "<<end - start <<" ms"<<endl;  
  22.     //c style writing file  
  23.     FILE* fp = fopen(c_write_file, "w");  
  24.     start =  clock();  
  25.     for(int i=0; i < TEST_SIZE; ++i)  
  26.     {  
  27.         char tmp[1];  
  28.         tmp[0] = char(i);  
  29.         fwrite( tmp, 1, 1, fp);  
  30.     }  
  31.     end = clock();  
  32.     fclose(fp);  
  33.     cout<<"C style: "<<end - start <<" ms"<<endl;  
  34.     cin.get();  
  35. }  
 

 

实验结果:

 

图4

图5

图6

 

 

对比图4 和 图1、 图5 和 图2、图6 和 图3, 可以看到  << 运算符没有 ofstream.write(), 快, 但两者还是没有 fwrite() 快

 

结论: 效率   fwrite() >  ofstream.operator<<() > ofstream.write() 

 

 

 

 

3. 下面做读文件的比较:

 

程序设计思路: 用两种方法去读一个近100M的文本,记录时间。

 

实验代码:

 

  1. void test_read()  
  2. {     
  3.     const char* read_file = "H://read4.txt";  
  4.     const int BUF_SIZE = 1024 ;  
  5.     char buf[BUF_SIZE];  
  6.     //c++ style writing file  
  7.     ifstream ifs(read_file,ios::binary);  
  8.     assert(ifs);  
  9.     time_t start, end;  
  10.     start =  clock();  
  11.     while(!ifs.eof())  
  12.     {  
  13.       ifs.read(buf,BUF_SIZE);  
  14.     }  
  15.     end = clock();  
  16.     ifs.close();  
  17.     cout<<"C++ style: "<<end - start <<" ms"<<endl;  
  18.     //c style writing file  
  19.     FILE* fp = fopen(read_file, "rb");  
  20.     start =  clock();  
  21.     int len = 0;  
  22.     do  
  23.     {  
  24.         len = fread(buf,1,BUF_SIZE,fp);  
  25.         //cout<<len<<endl;  
  26.     }while(len != 0);  
  27.     end = clock();  
  28.     fclose(fp);  
  29.     cout<<"C style: "<<end - start <<" ms"<<endl;  
  30.     cin.get();  
  31. }  
 

 

 

实验结果:

图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

分享到:
评论

相关推荐

    ofstream,ifstream,fstream读写文件

    在编程总经常会用到读写文件,基本都是使用ofstream,ifstream,fstream

    fstream文件读写

    C++ iostream对文件流操作,实现文件读写,简单方便。

    C语言头文件 FSTREAM.H

    C语言头文件 FSTREAM.HC语言头文件 FSTREAM.HC语言头文件 FSTREAM.HC语言头文件 FSTREAM.HC语言头文件 FSTREAM.HC语言头文件 FSTREAM.HC语言头文件 FSTREAM.HC语言头文件 FSTREAM.HC语言头文件 FSTREAM.HC语言头文件...

    C++_fstream的使用方法

    C++_fstream的使用方法,ifsream,ofstream

    c++ 文件操作(fstream)

    c++ 文件操作 fstream ifstream ofstream

    结构体序列化读写二进制文件类

    数据用二进制方式保存无疑是能减小数据文件体积!此类就是鉴此思想编写 类包括数据写入 读写(文件头(结构体)部分 记录数据基本参数和文件的数据块数量 正文部分为存数据(结构体))高效实现块写 块读 !

    C++格式化读写文件操作

    C++中的文件读写可以使用标准库中的iostream库来完成。下面是描述如何进行格式化的文件读写的步骤,不包含具体的代码实现: 包含头文件:在程序中包含iostream头文件,以便使用输入输出流。 打开文件:使用fstream...

    C语言头文件 FSTREAM

    C语言头文件 FSTREAMC语言头文件 FSTREAMC语言头文件 FSTREAMC语言头文件 FSTREAMC语言头文件 FSTREAMC语言头文件 FSTREAMC语言头文件 FSTREAMC语言头文件 FSTREAMC语言头文件 FSTREAMC语言头文件 FSTREAMC语言...

    使用 <fstream> 类进行文件的 I/O 处理

    传统的文件 I/O 库如 Unix 的 &lt;io.h&gt; 和 &lt;stdio.h&gt; ,由于其程序接口的原因,在很大程度上强制程序员进行某些处理,缺乏类型安全和国际化支持。C++ 的 &lt;fstream&gt; 库则在文件的 I/O 方面提供了一个增强的、面向对象的...

    C++流操作之fstream用法介绍

    在Windows平台对文件进行存取操作可选的方案有很多,... fstream有两个派生类,即ifstream和ofstream,分别对应输入文件流、输出文件流。在使用它们之前,必须将它们的头文件包含到你的cpp文件中。创建一个文件流的方

    C++文件读写总结 !!!

    事实上, &lt;iostream.h&gt; 已经被&lt;fstream.h&gt;包含了, 所以你不必包含所有这两个文件, 如果你想显式包含他们,那随便你。我们从文件操作类的设计开始, 我会讲解如何进行ASCII I/O操作。如果你猜是"fstream," 恭喜你答对...

    C++ fstream文件流读 中字符串string与b VB ListView控件各种

    C++ fstream文件流读 中字符串string与b VB ListView控件各种

    c++读写文本文件

    c++读写文本文件,实现对文件的读和取操作,用到了fstream流的概念。

    来自实际工程项目-VC++读写.CLD文件二进制码流

    该源码来自于我做的实际工程项目,绝不含bug及其他不厚道的改动,拿来就可用!希望对其他有这方面应用的众...fstream 读.CLD二进制码流 生成.raw,.txt等文件; 读.tfw,.tiff文件; fsteam 写回不加密的.CLD二进制文件

    fstream头文件

    fstream 继承 iostream; fstream 拥有iostream功能,但并不是包含关系 fstream 是对文件操作 而 iostream 是 对 标准输入输出文件的操作

    C++文件读写操作

    本文介绍了对文本文件、二进制文件的读写打开关闭等操作,以及fstream、 ifstream、ofstream的使用及方法。

    c++ fstream类详解

    fstream c++ fstream类详解

    fstream的常用用法

    &lt;fstream&gt; 文件的I/O库提供了ANSI C的很多有用的优点,包括面向对象的界面,国际化和地方化的支持,安全性能,以及简单的调试

    文件流的读写(标准文件流)

    本代码封装使用了fstream进行文件的读写如有错误请指正

    编程头文件:fstream.h

    如果你的fstream.h文件缺失,或者出了问题,可以直接下载这个文件,编程常用

Global site tag (gtag.js) - Google Analytics