話說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以上的優化程度就可以自動在匯編指令層級變成這種形式
咋開優化?
DEVC++工具欄-》工具-》編譯選項-》編譯器-》編譯時加入以下命令-》鍵入-O2-》
-》代碼生成優化-》代碼生成-》優化級別
noip2017 rp++