update&fixed
io流解绑千万不要使用endl,务必替换为‘\n’!
众所周知,C++自带了各种输入方式
比如cin,应该是许多人第一个接触的输入方式。
然而,总有些数据极大的毒瘤题,甚至必须加快读入读出才能保证勉强不超时。
所以,咱就来研究一下各种读入与输出的效率。
本次测试仅仅针对int类型数据
输入
首先是最常见的,cin与scanf。
在很久以前,老师就告诉过我们,scanf比cin快。
40w数据量下的测试结果(windows环境下)也是这样说的:
scanf:99.5028ms
cin : 211.197ms
cin是scanf两倍多......(老师说的果然没错
但是
你想过没有,有一天,cin可能scanf快?
上网查询的结果:C++中cin要与scanf同步(即能够同时正常使用),捆绑了输入输出流,牺牲亿一点点cin的效率。而单从实现原理上看,cin应该是要大于scanf的。
可以大致理解为cincout时又用scanfprintf整了一遍
所以,给cin/cout解绑,可以使其更快。
但是此时的代码里不能有scanf,不然会乱码
所以不推荐广泛使用
解绑代码如下:
ios::sync_with_stdio(0);//初步释放
cin.tie(0);//解绑输入流
cout.tie(0);//解绑输出流
之后再来测试一下时间:
cin(解绑后) : 44.5467ms
甚至快于scanf!(多次测试结果一样,不展示了)
输出
这里直接上数据了。
为了增大差距加了400w数据
cout :646.71ms
cout(解绑) : 534.531ms
printf: 498.898ms
(由于是直接打印"0"这个字符所以要快一点)
以上就是c++自带的输入输出了。
然而我们还能手写快读快写,由于是对字符进行操作,效率不低。
而且常数小
/*快速读入函数*/
inline int read()
{
int s=0,w=1;
char ch=getchar();//getchar()速度>scanf
while(ch<'0'||ch>'9')
{
if(ch=='-')w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return s*w;
}
/*快速输出*/
inline void out(int x)
{
if(x>9)
out(x/10);
putchar(x%10+'0');
}
测试结果:
快读(40w数据): 10.1961ms
快写(400w数据):7.5677ms
没什么好说的,令人发指的快。
缺点也显而易见 : 难写 (懒
而且,当数据间有多个空格隔开时,快读会被卡,这时候就不如cin了
讨论完毕
原文链接: https://www.cnblogs.com/IzayoiMiku/p/12710280.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;
也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/342327
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!