读书人

fstream与 C 作风(例如fread 和 fwri

发布时间: 2012-12-21 12:03:49 作者: rapoo

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. }??
?

?

?

实验结果:

fstream与 C 作风(例如fread 和 fwrite )两种读写文件方法的效率比较

图1

fstream与 C 作风(例如fread 和 fwrite )两种读写文件方法的效率比较

图2

fstream与 C 作风(例如fread 和 fwrite )两种读写文件方法的效率比较

图3

?

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

?

?

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

?

?

实验代码:

[cpp]?view plaincopy
  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. }??
?

?

实验结果:

?

fstream与 C 作风(例如fread 和 fwrite )两种读写文件方法的效率比较

图4

fstream与 C 作风(例如fread 和 fwrite )两种读写文件方法的效率比较

图5

fstream与 C 作风(例如fread 和 fwrite )两种读写文件方法的效率比较

图6

?

?

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

?

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

?

?

?

?

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

?

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

?

实验代码:

?

[cpp]?view plaincopy
  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. }??
?

?

?

实验结果:

fstream与 C 作风(例如fread 和 fwrite )两种读写文件方法的效率比较

图7

?

结论: 读取一个 100M 的文件, fread() 的效率 是 ifstream.read()的将近十倍! (此结论惊人!)

?

?

?

查看评论
2楼?fstream与 C 作风(例如fread 和 fwrite )两种读写文件方法的效率比较
你的结论的确惊人。
看看我用你的代码在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楼?fstream与 C 作风(例如fread 和 fwrite )两种读写文件方法的效率比较
C++的输入输出不要告诉其数据类型,而是采用重载实现的,这个当然比C耗时了。C在读取的时候,都有格式控制符来告诉数据类型的。一般来说,gets比scanf快,scanf比cin快。

?

转载:http://blog.csdn.net/tyt2222008/article/details/6088489

读书人网 >编程

热点推荐