我觉得作者写的挺好,评论也写的很对。

目前我的项目就是在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. cout<<"Test size :" << TEST_SIZE <<endl;
  7. //c++ style writing file
  8. ofstream of(c_plus_write_file);
  9. assert(of);
  10. time_t start, end;
  11. start =  clock();
  12. for(int i=0; i < TEST_SIZE; ++i)
  13. {
  14. char tmp[1];
  15. tmp[0] = char(i);
  16. of << tmp[0];
  17. }
  18. end = clock();
  19. of.close();
  20. cout<<"C++ style: "<<end - start <<" ms"<<endl;
  21. //c style writing file
  22. FILE* fp = fopen(c_write_file, "w");
  23. start =  clock();
  24. for(int i=0; i < TEST_SIZE; ++i)
  25. {
  26. char tmp[1];
  27. tmp[0] = char(i);
  28. fwrite( tmp, 1, 1, fp);
  29. }
  30. end = clock();
  31. fclose(fp);
  32. cout<<"C style: "<<end - start <<" ms"<<endl;
  33. cin.get();
  34. }

实验结果:

图1

图2

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

实验结果:

图4

图5

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

实验结果:

图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 )两种读写文件方法的效率比较相关推荐

  1. PHP中两种包含文件方式、三种注释风格、四种标记风格

    2019独角兽企业重金招聘Python工程师标准>>> 一.两种包含文件的方式 ①require语法格式:require("文件名"):这个函数通常放在PHP程序 ...

  2. 用fread()和fwrite()读写文件

    ANSI C文件系统提供fread()和fwrite()两个函数,用于读/写长于一字节的数据类型.这两个函数允许读/写各种类型的数据块.它们的原型是: size_t fread(void *buffe ...

  3. fwrite函数Matlab,fread和fwrite函数,C语言fread和fwrite函数详解

    对文件格式化读写函数 fprintf 与 fscanf 而言,尽管它可以从磁盘文件中读写任何类型的文件,即读写的文件类型可以是文本文件.二进制文件,也可以是其他形式的文件.但是,对二进制文件的读写来说 ...

  4. C语言 fread()与fwrite()函数说明与示例

    1.作用 读写文件数据块. 2.函数原型 (1)size_t fread ( void * ptr, size_t size, size_t count, FILE * stream ); 其中,pt ...

  5. 【C 语言】文件操作 ( 使用 fread 和 fwrite 实现二进制文件的拷贝 | stat 统计文件大小 | feof 判定文件结尾 )

    文章目录 一.stat 统计文件大小 二.feof 判定文件结尾 三.使用 fread 和 fwrite 实现二进制文件的拷贝 一.stat 统计文件大小 统计文件大小 , 需要借助 stat 结构体 ...

  6. 文件操作:fread()和fwrite()

    fread和fwrite函数功能     用来读写一个数据块.   一般调用形式     fread(buffer,size,count,fp);     fwrite(buffer,size,cou ...

  7. fread和fwrite函数功能

    fread和fwrite函数功能   用来读写一个数据块. 一般调用形式   fread(buffer,size,count,fp);   fwrite(buffer,size,count,fp); ...

  8. Fread 和fwrite的参数不同,返回值不同

    函数fwrite 功能   C语言函数,向文件写入一个数据块  . size_t fwrite(const void* buffer, size_t size, size_t count, FILE* ...

  9. fread、fwrite、fopen函数的简单使用和open、read、write区别解析

    这几个函数的区别:fread.fwrite.fopen和open.read.write区别解析 标准C库函数的简单使用 fopen函数原型: #include <stdio.h> FILE ...

最新文章

  1. .net 将html写成的table 转换成excel_如何使用Pandas将二维表(DataFrame)反转为一维列表?...
  2. C++利用二次探查实现存储机制hash table的算法(附完整源码)
  3. 一个C++程序员生产力,大概相当20个C程序员,200个java程序员?
  4. mouseover和mouseenter的区别
  5. Android-HelloWorld
  6. [JNI] 开发基础(7)结构体
  7. apktool + dex2jar + xjad反编译apk文件
  8. 贝叶斯公式的理解——机器学习算法(一)
  9. YYText的介绍和使用
  10. 全网首发stm8s的硬件I2C读取bme280(bmp280)的C源程序
  11. nextjs的发布,pm2发布nextjs项目
  12. 自定义设置HTTP响应头
  13. 在Word中,如何删除页眉页脚
  14. mysql error code: 1205_Mysql错误:ERROR 1205 (HY000): Lock wait timeout exceeded解决办法
  15. 阿里云Centos7服务器域名解析和Nginx配置
  16. Okhttp之Https
  17. mmseg底层代码分析及修改
  18. mysql游标 循环_MySQL游标循环问题?
  19. 优知学院总结之Mysql面试
  20. 点波地图css,沙漠地图,提波镇点位玩法攻略

热门文章

  1. P1165 日志分析
  2. MVC开发中的常见错误-02-在应用程序配置文件中找不到名为“OAEntities”的连接字符串。...
  3. Struts2执行流程
  4. eclipse代码格式化
  5. IT痴汉的工作现状16-职业发展
  6. 判断字符串中是否包含Emoji表情代码
  7. on the way
  8. 修改HUDSON_HOME
  9. 接口协作--apipost接口协作工具
  10. python开发程序员应该知道的面试技巧和注意事项