您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:87 来源:vckbase.com

本文章共13664字,分9页,当前第7页,快速翻页:
 

  POGO(由配置指导的优化)是很多优化成为可能。在计数探测器的基础上,在每个函数调用处都可以使用内联。值探测器使switch和if-else语句重组来取出使用频度最高的值并且能避免在找到常用case之前就有过多不必要的尝试。代码段会被重新安排,这样最常用的代码就排在一起,而不是强迫性的在代码内进行不必要的跳转。这避免了 Translation Lookaside Buffer(TLB)[译者注:翻译查找缓冲]中高开销的吞吐量和页面交换。
  不常使用的代码可以放在这个模块的一个特殊的段落中,这样也会有助于避免这些问题。通过使用虚拟调用的途径,以便经常导致对某一特定类型的虚拟调用在大多情况下的避免对虚表的查找。通过使用部分内联来确保只对函数中经常使用的代码段进行内联,而这是有以调用函数为基础的调用来决定的。此外,某些代码段会以某种优化为前提进行编译,而另外一些代码段都按其他一些不同的目的而编译。比如说,经常使用的和/或小的函数可以按最大化性能角度来编译(/O2);而不经常使用和/或大一些的函数会被编译为占用最少的空间(/O1)。
  如果你能够了解你所在的实际工作环境并能将你的应用程序投入使用,程序的性能将会得到最大限度的发挥。最近,SQL Server 使用 POGO 进行了重新编译,在很多常用情况下,获得30%的性能飙升。这样下去,你也许会猜到微软会开始使用这一技术来将它的许多产品进行重新编译。应注意的是,在你建立规范版本的 配置时,不要试图覆盖全部的代码,这点是非常重要的。POGO 的全部意义在于如何优化普适性的情况。如果你对全部代码进行 POGO 优化的话,你或许会得不偿失。
  Visual C 2005 还加入了对 OpenMP 的支持,它是一个建立多线程程序的开放性标准。它包含了一系列 Pragma 来告诉编译器哪些代码段能够进平行处理。与前面循环关系不大的一些大的循环结构最适合使用 OpenMP。看一下下面这个简单的 copy 函数,它将数组a和b的值相加,并将其和存入数组c中。
  void copy (int a[],int b[],int c[],int length)

  {

    #pragma omp parallel

    for (int i=0;i<length;i  )

     {

       c[i]=a[i] b[i];

      }

  }  
在有多处理器的机器上,编译器会生成多线程来执行每一次循环,
  而每个线程将会执行复制动作的一个子集。值得注意的是,编译器无法确认这个循环是否依赖于其它代码,因此它不会阻止你在不适当的情况下使用这些 pragma。如果有依赖关系存在的话,你极有可能得到与你想像不同的错误结果,尽管这在要求上是正确的。尽管在使用 OpenMP 时最大的好处是像上面例子中的平行处理循环的情况,在直线型代码中使用它也会 使性能得到改善"#pragma omp section" 参数可以用来对一段代码中非依赖性的部分做出标记,这样可以让开发人员指定可以平行运行的区域。然后编译器就能够产生多线程来在不同的处理器上执行这些部分了。
  对所有使用.NET进行开发的人来说,一个重要的改变是 Visual C 2005 优化器在对 MSIL 做出的优化和对本机平台做出的优化大体上是一样的,尽管优化器是通过不同的调节选项来完成这一点的,而今天的实时(JIT)编译器是在运行时分析并优化的,它允许 C 编译器在初次编译时就可以进行优化,这样也可以提供极大的性能优势 ( C 编译器就有了更多的时间来进行分析而不是进行JIT ) 。Visual C 2005 编译器首次对托管类型进行优化:对循环进行的优化,表达式优化和内联。但是有些地方编译器是无法对基于.NET的代码进行优化的。举个例子来说,由于指针算术运算的问题,它就有一些无能为力了,而且某些代码由于 CLR 对严格的类型的要求和成员的可访问范围的规定而无法内联,尽管编译器的确是对合法的内联机会进行了大量的分析。此外,要优化 MSIL 需要平衡考虑对JIT 的影响。
 
本文章更多内容<<上一页 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 下一页>>
相关文章

IP Messenger 详细分析
可设置单元格颜色的ClistCtrl类
利用VC++开发ASP图像处理组件(二)
从 ADO 迁移到 ADO.NET(一)
获得 Win32 窗口句柄的更好的方法
关于 IDispatch 接口的 LPDispatch 属性的实
用ATL开发复合控件
后缀表达式求值及校验
浅谈PDFlib中文输出(四)PDFlib 接收的几种
事件编程(二)
毫秒定时器
类似于FlashGet的悬浮框的制作
不重起Windows直接更改IP地址
MFC程序员的WTL指南: 中文版序言
COM 组件设计与应用(五)——用 ATL 写第一
编写多文档应用程序
PhotoShop插件开发之选区(Selection)
VC初学者入门系列之二:消息循环
定制调试诊断工具和实用程序——摆脱DLL“地
WMI 的一个实现

相关评论


本文章所属分类:首页 VC++

  热门关键字: