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); 后结果:

 

 

实验代码:

[cpp]  view plain copy
  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的文本,记录时间。

 

实验代码:

 

[cpp]  view plain copy
  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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++文件读写fstream结构体是C++中用于文件读写的一种标准库。它提供了一种简单的方式来读写文件,包括文本文件和二进制文件。具体来说,fstream结构体提供了三种不同的文件操作方式:读取(input)、写入(output)和读写(input/output)。你可以使用它来打开一个文件、读取文件内容、写入数据到文件或者在文件中进行读写操作。 下面是一个简单的例子来说明如何使用fstream结构体来读写文件: ``` #include <iostream> #include <fstream> using namespace std; int main() { // 创建一个fstream对象并打开文件 fstream file("example.txt", ios::in | ios::out | ios::trunc); // 写入数据到文件 file << "Hello, World!" << endl; // 从文件中读取数据 string line; getline(file, line); cout << line << endl; // 关闭文件 file.close(); return 0; } ``` 在上面的代码中,我们首先创建了一个fstream对象,并通过构造函数打开了名为example.txt的文件。在这个例子中,我们使用了三个不同的文件操作方式:ios::in(输入)、ios::out(输出)和ios::trunc(截断)。这意味着我们可以从文件中读取数据,也可以向文件中写入数据,并且每次打开文件时都会清空文件内容。 接下来,我们将“Hello, World!”写入到文件中。然后,我们使用getline()函数从文件中读取一行数据,并将其存储到字符串变量line中。最后,我们将line输出到控制台。 最后,我们调用close()函数关闭文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值