zoukankan      html  css  js  c++  java
  • C++中的输入输出

    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了

    讨论完毕

  • 相关阅读:
    ant的安装和配置
    jmeter3.x的jtx文件解析
    爬虫:网页里元素的xpath结构,scrapy不一定就找的到
    如何实现新浪微博功能:关注某个的发布信息,自动点赞和转发
    性能测试各个指标的含义
    python模块相关
    curl的用法
    第十八章 Python批量管理主机(paramiko、fabric与pexpect)
    死锁产生的原因和解锁的方法
    读写分离死锁解决方案、事务发布死锁解决方案、发布订阅死锁解决方案
  • 原文地址:https://www.cnblogs.com/IzayoiMiku/p/12710280.html
Copyright © 2011-2022 走看看