神奇的常數優化


話說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\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+

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

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

 

怎么回事呢?

這個快一倍的原因在csapp第五章是有的,

原因是cpu整數加法運算器有多個,

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

通過這種方法可以增加流水線吞吐量。

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

如果你把gcc開到o3以上的優化程度就可以自動在匯編指令層級變成這種形式

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

 

 

咋開優化?

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

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

 

 

 

 

 

noip2017 rp++

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM