c/c++ I/o效率?

上上之杰 2014-08-28 02:46:01
下面三种不同的输入方式,怎么比较效率
源于《算法竞赛入门经典》
有大神给我解释吗

#define LOCAL
#include<iostream>
#include<string>
#include<time.h>
using namespace std;

int main()
{

#ifdef LOCAL
freopen("test.in.txt","r",stdin);
#endif

string s;
while(cin>>s) cout<<s<<endl;
printf("%.300000lf",(double)clock()/CLOCKS_PER_SEC);
return 0;
}


#define LOCAL
#include<stdio.h>
#include<time.h>

int main()
{

#ifdef LOCAL
freopen("test.in.txt","r",stdin);
#endif

char ch;
while((ch=getchar())!=EOF) putchar(ch);
printf("%.10000lf",(double)clock()/CLOCKS_PER_SEC);
return 0;
}



#define LOCAL
#include<stdio.h>
#include<time.h>
char p[10000];
int main()
{

#ifdef LOCAL
freopen("test.in.txt","r",stdin);
#endif

while(fgets(p,10000,stdin)!=NULL) puts(p);
printf("%.10lf",(double)clock()/CLOCKS_PER_SEC);
return 0;
...全文
353 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
上上之杰 2014-08-30
  • 打赏
  • 举报
回复
引用 9 楼 xiaohuh421 的回复:
这个比较需要在同平台下, 同样的硬件环境才有可比性. 如果你只懂读取文本. 那么你就这样做. 打开你的文本. Ctrl+A Ctrl+C. End , Ctrl+V 循环N次 直到你的文本达到几百M或者几个G. 再测试读取写 (注: 大家可能会说, 那要复制粘贴到什么时候去, 实际上每次是x2的, 2的32次方是多少, 相信大家都会算)
根据你的方法 终于验证出来了, 我一共复制到了100000行(还不费力)。给你一百个赞! 第一个 time=1.1950000;; 第二个time=0.141000000; 第三个time=0.036000000;
mujiok2003 2014-08-29
  • 打赏
  • 举报
回复
引用 7 楼 u011131596 的回复:
[quote=引用 6 楼 mujiok2003 的回复:] 谈IO效率, 要考虑数据量大小(实际用例), 结合缓冲机制, 函数调用开销, 管道效应等。 只看代码, 难说孰优孰劣。
那个题目是不超过1000行字符串,每行不超过10000个字符,不包括空白(如空格,Tab); 我要怎么验证这题[/quote] 1K*10K ~= 10M而已, 可以把IO的缓冲开大点或者一次性全部读入。 可能 第三个较优(函数调用次数较少,约1K次), getchar最次(函数调用次数最多, 约10M次) ,cin 》版本再两者之间
上上之杰 2014-08-29
  • 打赏
  • 举报
回复
引用 6 楼 mujiok2003 的回复:
谈IO效率, 要考虑数据量大小(实际用例), 结合缓冲机制, 函数调用开销, 管道效应等。 只看代码, 难说孰优孰劣。
那个题目是不超过1000行字符串,每行不超过10000个字符,不包括空白(如空格,Tab); 我要怎么验证这题
赵4老师 2014-08-29
  • 打赏
  • 举报
回复
无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
xiaohuh421 2014-08-29
  • 打赏
  • 举报
回复
这个比较需要在同平台下, 同样的硬件环境才有可比性. 如果你只懂读取文本. 那么你就这样做. 打开你的文本. Ctrl+A Ctrl+C. End , Ctrl+V 循环N次 直到你的文本达到几百M或者几个G. 再测试读取写 (注: 大家可能会说, 那要复制粘贴到什么时候去, 实际上每次是x2的, 2的32次方是多少, 相信大家都会算)
mujiok2003 2014-08-28
  • 打赏
  • 举报
回复
谈IO效率, 要考虑数据量大小(实际用例), 结合缓冲机制, 函数调用开销, 管道效应等。 只看代码, 难说孰优孰劣。
上上之杰 2014-08-28
  • 打赏
  • 举报
回复
引用 4 楼 jianwen0529 的回复:
[quote=引用 2 楼 u011131596 的回复:] [quote=引用 1 楼 jianwen0529 的回复:] 同样的数据,读取的次数少效率高。 最后一个效率肯定最高 //////////////////////////////////////////////////////////////////////////////////////// 其次是第一个>第二个(个人认为,也许实际不是)
就是不知道怎么验证才问的。 我也不知道答案是什么。 我的答案全是0.0000000000000000000[/quote] 因为你数据太水了,以至于在极短的时间完成,你可以用一部电影(几百M或者几G)的来读取,大概测试下时间。 还有之前没注意。 你第一个例子跟你文件流没有关系啊 你打开一个文件,然后用cin输入数据这算什么?! 第二个getchar也不是从文件读取数据啊 再然后取得测试时间也有些问题吧?![/quote] freopen("test.in.txt","r",stdin); 是把stdin 重定位test.in.txt中 应该没错吧? 这个太菜了不知道怎么读取一部电影,我只知道怎么在文本中打入一些字符串
幻夢之葉 2014-08-28
  • 打赏
  • 举报
回复
引用 2 楼 u011131596 的回复:
[quote=引用 1 楼 jianwen0529 的回复:] 同样的数据,读取的次数少效率高。 最后一个效率肯定最高 //////////////////////////////////////////////////////////////////////////////////////// 其次是第一个>第二个(个人认为,也许实际不是)
就是不知道怎么验证才问的。 我也不知道答案是什么。 我的答案全是0.0000000000000000000[/quote] 因为你数据太水了,以至于在极短的时间完成,你可以用一部电影(几百M或者几G)的来读取,大概测试下时间。 还有之前没注意。 你第一个例子跟你文件流没有关系啊 你打开一个文件,然后用cin输入数据这算什么?! 第二个getchar也不是从文件读取数据啊 再然后取得测试时间也有些问题吧?!
FancyMouse 2014-08-28
  • 打赏
  • 举报
回复
玩竞赛折腾这个那也是属于实在闲的没事做。 只要记着大数据(输入文件可能500K以上的)用stdio就行了,其他别管,好好练算法。
上上之杰 2014-08-28
  • 打赏
  • 举报
回复
引用 1 楼 jianwen0529 的回复:
同样的数据,读取的次数少效率高。 最后一个效率肯定最高 //////////////////////////////////////////////////////////////////////////////////////// 其次是第一个>第二个(个人认为,也许实际不是)
就是不知道怎么验证才问的。 我也不知道答案是什么。 我的答案全是0.0000000000000000000
幻夢之葉 2014-08-28
  • 打赏
  • 举报
回复
同样的数据,读取的次数少效率高。 最后一个效率肯定最高 //////////////////////////////////////////////////////////////////////////////////////// 其次是第一个>第二个(个人认为,也许实际不是)

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧