• OI中卡常数技巧


    一、I/O优化

    读入优化是卡常数最重要的一条!

    1 inline int read()
    2 {
    3     int x=0,f=1;char c=getchar();
    4     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    5     while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    6     return x*f;
    7 }

    输出优化好像不常用...

    二、inline

    在声明函数之前写上inline,可以加快一下函数调用,但只能用于一些操作简单、调用频繁的函数。涉及递归,大号的循环等很复杂的函数,编译器会自动忽略inline。(我不知道强制inline有没有用)。

    三、register

    在定义变量前写上register,用于把变量放到CPU寄存器中,适用于一些使用频繁的变量(比如循环变量),但寄存器空间有限,如果放得变量太多,多余变量就会被放到一般内存中

    快到什么境界?

    register int a=0;
    for(register int i=1;i<=999999999;i++)
    a++;
    
    int b=0;
    for(int i=1;i<=999999999;i++)
    b++;

    优化:0.2826 sec

    不优化:1.944sec

    四、初始化优化

    在初始化Floyd或者其他类似的东西

    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            gra[i][j]=inf
    for(int i=1;i<=b;i++)
        gra[i][i]=0

    是比

    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            if(i==j)    gra[i][j]=0;
            else       gra[i][j]=inf
        }    

    快的(测试大约1是2的80%的时间)

    原因后者每次都要判断

    五、循环展开

    循环展开也许只是表面,在缓存和寄存器允许的情况下一条语句内大量的展开运算会刺激 CPU 并发(前提是你的 CPU 不是某 CPU)...

    • 减少了不直接有助于程序结果的操作的数量,例如循环索引计算和分支条件。
    • 提供了一些方法,可以进一步变化代码,减少整个计算中关键路径上的操作数量。

    用法(下面是一个将一个int 类型数组初始化为0的代码段):

    void Init_Array(int *dest, int n)
    {
        int i;
        for(i = 0; i < n; i++)
            dest[i] = 0;
    }

    而如果用循环展开的话,代码如下:

    void Init_Array(int *dest, int n)
    {
        int i;
        int limit = n - 3;
        for(i = 0; i < limit; i+= 4)//每次迭代处理4个元素
        {
            dest[i] = 0;
            dest[i + 1] = 0;
            dest[i + 2] = 0;
            dest[i + 3] = 0;
        }
        for(; i < n; i++)//将剩余未处理的元素再依次初始化
            dest[i] = 0;
    }

    六、取模优化

    //设模数为 mod
    inline int inc(int x,int v,int mod){x+=v;return x>=mod?x-mod:x;}//代替取模+
    inline int dec(int x,int v,int mod){x-=v;return x<0?x+mod:x;}//代替取模-

    七、前置++

    后置 ++ 需要保存临时变量以返回之前的值,在 STL 中非常慢。事实上,int 的后置 ++ 在实测中也比前置 ++ 慢 0.5 倍左右(UOJ 上自定义测试)

    八、bool优化

    不要开bool,所有bool改成char,int是最快的(原因不明)。

    九、选择结构优化

    if()else语句比()?():()语句要慢,逗号运算符比分号运算符要快。

  • 相关阅读:
    apache-kylin 权威指南—读书笔记
    数据仓库之数据仓库环境——读书笔记
    R 语言—基本绘图
    MapReduce 过程分析
    HDFS 的运行机制
    R 语言贷款月供数据分析
    UML 简介笔记
    为什么要学习 UML?
    scrum 项目的基本模式
    elasticsearch 集群配置
  • 原文地址:https://www.cnblogs.com/ibilllee/p/7674633.html
Copyright © 2020-2023  润新知