【学习笔记】I \ O 优化

更好的阅读体验

全文共 2447 字,预计阅读时间 6 分钟。


目录

一、速度测试:

1. cin - cout

2. scanf() - printf()

3. read() - write()

4.  总结

更多学习资源:

1. 洛谷日报#110[encore]浅谈C++ IO优化——读优输优方法集锦

2. 读入、输出优化 - OI Wiki

3. 编译火车头


一、速度测试:

10000 个 1 至 100000000 的数,cin-cout,printf()-scanf(),read()-write(),到底那个更快呢?让我们来创建一道题来检验一下它们的快慢。


1. cin - cout

用时13ms。

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    int n;
    for(int i=1;i<=10000;i++)
    {
        cin >> n;
        cout << n << endl;
    }
    return 0;
}

如果加了优化呢?用时8ms。

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    int n;
    for(int i=1;i<=10000;i++)
    {
        cin >> n;
        cout << n << endl;
    }
    return 0;
}

2. scanf() - printf()

用时4ms

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    int n;
    for(int i=1;i<=10000;i++)
    {
        scanf("%d",&n);
        printf("%d\n",n);
    }
    return 0;
}

再让我们看看优化后的结果,用时3ms。

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    int n;
    for(int i=1;i<=10000;i++)
    {
        scanf("%d",&n);
        printf("%d\n",n);
    }
    return 0;
}

3. read() - write()

用时4ms。

#include <iostream>
#include <cstdio>
using namespace std;

int read()
{
    int x=0,w=1;
    char ch=0;
    while (ch<'0'||ch>'9')
    {  
        if(ch=='-')
        {
        	w=-1; 
        }
        ch=getchar();               
    }
    while(ch>='0'&&ch<='9')
    { 
        x=x*10+(ch-'0');  
        ch=getchar(); 
    }
    return x*w;  
}

void write(int x) 
{
    if(x<0) 
    {  
        x =-x;
        putchar('-');
    }
    if(x>9) 
    {
    	write(x/10);  
    }
    putchar(x%10+'0');  
}

int main()
{
   std::ios::sync_with_stdio(false);
   std::cin.tie(0); 
   int n;
   for(int i=1;i<=10000;i++)
   {
        n=read();
        write(n);
        printf("\n");
   }
    return 0;
}

4.  总结

  • cin - cout 不管开不开优化都是三种 I / O 里最慢的。
  • scanf() - printf() 不开优化和 read() - write() 差不多,开了优化比 read() - write() 略快一些。
  • read() - write() 比开了优化的 scanf() - printf() 慢了1ms,和不开优化的 scanf() - printf() 用时差不多。

那为什么 read() - write() 反倒比 scanf() - printf() 还要慢呢?看一看 read() - write() 的代码,是不是换行是用 printf() 打出来的,如果不是每行一个整数,还是 read() - write() 要更好一些。

所以,最快的 I / O 组合是 read() - printf()。

最后,虽然 read() - write() 只能输入输出整数,不及 cin - cout 和 scanf() - printf() 的功能多,但是 read() - write() 的速度更快,而且 read() 还能去前导 0,这使 read() - write() 成为 OIer 对抗 TLE 的一大法宝(bushi)。

更多学习资源:

1. 洛谷日报#110[encore]浅谈C++ IO优化——读优输优方法集锦

2. 读入、输出优化 - OI Wiki

3. 编译火车头

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值