关于输入和输出

前话

上次在\(luogu\)的比赛失利了,只拿了170分/400分。后来一看用scanf可以直升210……

OI赛制在满分的时候会按你的程序运行时间来排名。

又是\(Luogu\)\(csp\)模拟赛,上星期去参加了一下,前两题满分,但是又是读入速度的问题,和前面的人断崖式缺了\(100+ms\),结果一看1e6的数据,前面的人全用了快读快写……

切入正题

我不甘心这么就结束这个问题,所以自己在电脑上试了数据,记录实验结果

这里是实验项目,可以自己试试

下面给出两个示例:

输入对比

数据为1~1e7(一千万的数据),下面是各个输入方式的效率对比。

\[cin运行时间:7.661000(s) \]

\[scanf运行时间:5.200000(s) \]

\[优化运行时间:1.877000(s) \]

很明显,快读的效率是最高的,\(scanf\)其次,\(cin\)最后。
你马上会感觉,难道我们的输入占这么多时间?

也许是我的电脑处理的慢

register优化

\(register\ int\),可以加速频繁使用的变量。

\(register\) 表示使用\(cpu\)内部寄存器

比较大小

现在来看看max和min的效率。

数据为1~1e8(一亿的数据),下面是\(STL\)和手写的比大小的对比。

\[不优化运行时间:0.795000(s) \]

\[优化后运行时间:0.665000(s) \]

这里在循环里加上了\(register \ int\)\(手写的max函数\)

然后会发现这里差不了多少,所以想优化就优化吧。

结尾

试验结束后,发现有些优化是不必要的,有些优化可以快很多。

像读和写,都是差距很大的,所以可以在考场上比赛之前把快读快写默一遍。

下面给出优化的code:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

#define in inline
#define rint register int
typedef long long LL;
typedef pair<int,int> PII;

in int read()
{
    rint x=0,f=0; register char ch=getchar();
    while(ch<'0'||ch>'9')f|=ch=='-',ch=getchar();
    while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
    return f?-x:x;
}
in void write(int x)
{
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
in void print(string s)
{
    for(int i=0;s[i]!='\0';i++) putchar(s[i]);
}
in int max(int a,int b) {return a>b?a:b;}
in int min(int a,int b) {return a<b?a:b;}

/*----------code----------*/
const int N=1e5+10;
int a[N];
int n,m,k;

int main()
{

    return 0;
}

posted @ 2022-07-28 17:40  Sankano  阅读(32)  评论(0编辑  收藏  举报