zoukankan      html  css  js  c++  java
  • 神奇的常数优化

    话说noip不开优化,那我们来看看开优化后会发生什么

    一个简单的累加

    #include<cstdio>
    #include<ctime>            //计时看看差别
    #include<iostream>
    using namespace std;
    int main()
    {
        int n=1000000000;
        int tn=n/2;
        clock_t a,b;
        a=clock();
    
        int sum=0;                       //一般的累加
        for(int i=0;i<=n;i++)    sum+=i;
    
        printf("%d
    ",b=clock()-a);//用时1
    
        int sum1=0,sum2=0;    //神奇的累加         循环展开+多路并行
        for(int i=0;i<=tn;i++)    sum+=i<<1,sum+=i<<1&1;
    
        printf("%d",clock()-b);//用时2
        return 0;
    }

    按理来说,上面的两种方法差不多(???)

    在DEVC++ 5.7.1中,xp系统(学校机房的那种)

    不开任何优化  大约前一种是8500ms+,后一种是4000ms+

    开-O1           1300ms+                   600ms+      //优化级别 low

    开-O2 以上                                          0                              0       //low以上

    怎么回事呢?

    这个快一倍的原因在csapp第五章是有的,

    原因是cpu整数加法运算器有多个,

    而同一个时间可以最多运算两个整数加法,

    通过这种方法可以增加流水线吞吐量。

    实际上,编译器会在第二次隐式汇编优化时候做这个优化,

    如果你把gcc开到o3以上的优化程度就可以自动在汇编指令层级变成这种形式

    源自:oi/acm中有哪些最黑的黑科技? - 知乎

    咋开优化?

    DEVC++工具栏-》工具-》编译选项-》编译器-》编译时加入以下命令-》键入-O2-》

                    -》代码生成优化-》代码生成-》优化级别

    noip2017 rp++

  • 相关阅读:
    RepositoryItemComboBox 用法1
    php 直接获取url参数赋值成变量。省去繁琐的获取参数,再一个个赋值
    什么是经验,就是解决问题的能力!!
    win7 上运行 php7 +
    win2008 server 多IP配置
    mysqlli 的基本用法
    PHP操作mongoDB 笔记
    关于PHP程序员技术职业生涯规划 转自 韩天锋
    linux 简单笔记
    ubantu 重启mysql
  • 原文地址:https://www.cnblogs.com/callmebg/p/7745282.html
Copyright © 2011-2022 走看看