深入理解计算机系统:优化程序性能

     在现代编译过程中可以依靠先进的编译器软件对程序实现编译优化。例如gcc可以用-O2,-O1几种不同的优化等级对程序实现编译优化,但是编译器必须考虑到编译的程序的安全性,所以编译器的优化能力也存在着局限性,不能通过提高效率而改变了程序的安全。所以有些地方需要人为的来进行优化。例如:函数调用和参数传递中都有可能出现副作用。编译对这些地方的优化都会很小心,甚至不会对其进行优化。
     void combine1(vec_ptr v, data_t *dest)
     {
          long int i;
          
          *dest=IDENT;
          for(i = 0;i<vec_length(v);i++)
          {
               data_t val;
               get_vec_element(v,i,&val);
               *dest = *dest OP val;
          }
     }
     优化程序提高程序效率主要有以下手段:
     1.消除循环的低效率
      void combine2(vec_ptr v, data_t *dest)
     {
          long int i;
          long int len =  vec_length(v);         

          *dest=IDENT;
          for(i = 0;i<len;i++)
          {
               data_t val;
               get_vec_element(v,i,&val);
               *dest = *dest OP val;
          }
     }
     2.减少过程调用
     void combine3(vec_ptr v, data_t *dest)
     {
          long int i;
          int len = vec_length(v);
         data_t * data=  get_vec_start(v);

          *dest=IDENT
          for(i = 0;i<len;i++)
          {             
               *dest = *dest OP data[i];
          }
     }
     3.消除不必要的存储器引用
     void combine4(vec_ptr v, data_t *dest)
     {
          long int i;
          int len = vec_length(v);
          data_t * data=  get_vec_start(v);
          data_t acc =IDENT;
      
          for(i = 0;i<len;i++)
          {             
               acc  =acc OP data[i];
          }
          *dest= acc;
     }
    由于当代的处理器是利用流水线可以利用流水线特性进行对程序的优化 也可以利用现代处理器的特性来对程序性能进行优化。
     1.将循环展开
     void combine5(vec_ptr v, data_t *dest)
     {
           long int i;
          int len = vec_length(v);
          int limits = len -1;
          data_t * data=  get_vec_start(v);
          data_t acc =IDENT;
      
          for(i = 0;i<limits ;i+=2)
          {             
               acc  =(acc OP data[i])OP data[i+1];
          }
          for(;i<len;i++)
          {
               acc = acc OP data[i];
          }
          *dest= acc;
     }
     这个过程并没有提高程序的效率。由于 acc  =(acc OP data[i])OP data[i+1]这行代码中acc操作现在流水中计算所以并没有提高程序的并行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值