神奇的常数优化

话说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++

发布了45 篇原创文章 · 获赞 14 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_34438779/article/details/81519370