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

     在现代编译过程中可以依靠先进的编译器软件对程序实现编译优化。例如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操作现在流水中计算所以并没有提高程序的并行。
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭