神奇的常數優化

話說noip不開優化,那咱們來看看開優化後會發生什麼ios

一個簡單的累加app

#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\n",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+spa

開-O1           1300ms+                   600ms+      //優化級別 lowcode

開-O2 以上                                          0                              0       //low以上blog

 

怎麼回事呢?ip

這個快一倍的緣由在csapp第五章是有的,get

緣由是cpu整數加法運算器有多個,編譯器

而同一個時間能夠最多運算兩個整數加法,

經過這種方法能夠增長流水線吞吐量。

實際上,編譯器會在第二次隱式彙編優化時候作這個優化,

若是你把gcc開到o3以上的優化程度就能夠自動在彙編指令層級變成這種形式

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

 

 

咋開優化?

DEVC++工具欄-》工具-》編譯選項-》編譯器-》編譯時加入如下命令-》鍵入-O2-》

                -》代碼生成優化-》代碼生成-》優化級別

 

 

 

 

 

noip2017 rp++

相關文章
相關標籤/搜索