话说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以上的优化程度就可以自动在汇编指令层级变成这种形式
咋开优化?
DEVC++工具栏-》工具-》编译选项-》编译器-》编译时加入以下命令-》键入-O2-》
-》代码生成优化-》代码生成-》优化级别
noip2017 rp++