免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1644 | 回复: 3

[C++] file slurp 问题 [复制链接]

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
发表于 2015-06-30 15:02 |显示全部楼层
用惯了Perl的slurp 函数,读文件杠杠的,到c++环境下找了个类似的
std::string ReadFile(const std::string &fileName)
{
        std::ifstream infile(fileName);
        if (infile) {
                std::string fileData((std::istreambuf_iterator<char>(infile)),
                        std::istreambuf_iterator<char>());
                infile.close();;
                return fileData;
        }
        return "";
}
结果效率很低,打开5兆的文件要7-8秒,perl的模块是秒开。
求效率高的slurp函数
谢谢

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
发表于 2015-06-30 15:58 |显示全部楼层
特意做了个测试,在VC中,生成一个5M的文本文件,用你的函数,debug下耗时1.718秒,release版本耗时0.171秒。

若先计算尺寸(tellp),免得string重分配的话,耗时可降低到 0.156
若再加上以二进制形式打开,耗时可降低到 0.140
若再以read成员函数整体读入,耗时可降低到 0.000
本来还想试试fopen的,好像没意义了

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
发表于 2015-06-30 16:30 |显示全部楼层

  1. std::string foo3( const char* filename ) // 50M文件,文本方式耗时0.203秒,二进制方式耗时0.093秒
  2. {
  3.     //std::ifstream infile(filename,std::ios::binary);
  4.     std::ifstream infile(filename);
  5.     infile.seekg( 0, std::ios_base::end );
  6.     std::ifstream::pos_type len = infile.tellg();
  7.     infile.seekg( 0, std::ios_base::beg );

  8.     std::string s( len, '\0' );
  9.     infile.read( &s[0], len );
  10.     s.resize( infile.gcount() );
  11.     return s;
  12. }

  13. std::string foo4( const char* filename ) // 50M文件,文本方式耗时0.187秒,二进制方式耗时0.078秒
  14. {
  15.     //FILE* fin = fopen( filename, "rb" );
  16.     FILE* fin = fopen( filename, "rt" );
  17.     fseek( fin, 0, SEEK_END );
  18.     long len = ftell( fin );
  19.     fseek( fin, 0, SEEK_SET );

  20.     std::string s( len, '\0' );
  21.     size_t n = fread( &s[0], 1, len, fin );
  22.     s.resize( n );
  23.     return s;
  24. }
复制代码

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
发表于 2015-06-30 16:36 |显示全部楼层
bruceteen 发表于 2015-06-30 15:58
特意做了个测试,在VC中,生成一个5M的文本文件,用你的函数,debug下耗时1.718秒,release版本耗时0.171秒 ...


您的测试结果与我相差甚大,那猜测这段函数应该是高效的,我再试试看。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP