优化增强您的Visual C++应用程序

虽然 Microsoft .NET Framework 确实能提高开发人员的工作效率,但许多人对托管代码的性能还是有些担忧。新版本的 Visual C++ 将会让您消除这些担忧。对于 Visual Studio 2005,C++ 语法本身得到了很大的改进,从而使它编写更加迅速。另外,还提供了一个灵活的语言框架来与公共语言运行库 (CLR) 相交互以便于编写高性能的程序。

许多编程人员认为 C++ 之所以能带来高性能,是因为它生成本机代码,但即使您的代码完全托管,仍然可以获得出众的性能。通过灵活的编程模型,C++ 不会让您束缚在面向过程编程、面向对象编程、可再生编程或者元编程。

另一个常见的误解是:不管使用什么语言,在 .NET Framework 中都能获得同样好的性能 — 通过各种编译器生成的 Microsoft 中间语言 (MSIL) 本质上是等同的。即使在 Visual Studio .NET 2003 中也无法这样,但在 Visual Studio 2005 中,C++ 编译器团队致力于确保优化本机代码多年所获得的所有经验都能够应用到托管代码优化上。C++ 为您提供充分的灵活性来进行更好的优化,比如进行高性能封送处理,这在其他语言中是无法做到的。此外,Visual C++ 编译器还生成任何 .NET 语言中最优化的 MSIL。结果是 .NET 中最优化的代码来自 Visual C++ 编译器。

优化的MSIL

在 .NET 环境中,编译分为两个不同的部分。第一部分为编程人员通过语言编译器(C#、Visual Basic? 或 Visual C++)进行编译和优化,以生成 MSIL。第二部分包括将 MSIL 送到实时 (JIT) 编译器或 NGEN,由它读取 MSIL 并随后生成优化的本机代码。显然,语言编译器和 JIT 是不可分离的组件,这意味着要生成好的代码,二者必须协同工作。

Visual C++ 始终提供任何编译器的最高级优化设置。这在托管代码中也没有改变。甚至在 Visual C++ .NET 2003 中这一点也很明显,它只是通过用于生成 MSIL 代码的本机编译器开始启用优化。

在 Visual C++ 2005 中,编译器可以对 MSIL 代码执行标准本机代码优化很大的子集。从基于数据流的优化到表达式优化,再到循环展开,这一切都包含在内。平台中的其他任何语言都无法做到这一级别的优化。在 Visual C++ .NET 2003 中,全程序优化 (Whole Program Optimization, WPO) 不支持使用 /clr 开关构建,但 Visual C++ 2005 为托管代码添加了这个功能。这个功能启用了跨模块优化,本文后面将会对其进行讨论。

在 Visual C++ 2005 中,托管代码唯一不可用的一种优化是 Profile Guided Optimizations,虽然在以后的版本中可能可用。有关更多信息,请参阅 Write Faster Code with the Modern Language Features of Visual C++ 2005。

JIT 和编译器优化交互

Visual C++ 生成的优化代码提供给 JIT 或 NGEN 以生成本机代码。不管 Visual C++ 编译器生成的代码是 MSIL 还是非托管代码,生成代码的优化器还是十几年前就已开发并已进行调整的优化器。

对 MSIL 代码的优化是对非托管代码进行优化的一个大子集。需要指出的是,允许的优化类随编译器生成的是可验证代码 (/clr:safe) 或非可验证代码 (/clr or /clr:pure) 的不同而不同。在少量的几种情况下,编译器会因为元数据或可验证性限制而无法完成操作,包括缩减运算量(将相乘转换成指针相加),以及将对一个类的私有成员的访问内联到另一个类的方法体中。

Visual C++ 编译器生成 MSIL 代码之后,就可以交给 JIT 进行处理。JIT 读取 MSIL 并开始执行优化,这些优化对 MSIL 中的变化很敏感。一个 MSIL 指令序列也许能够很好地进行优化,但另一个(语义上等同的)序列却可能抑制优化。例如,寄存器分配是一个优化,在这个优化中,JIT 优化器试图将变量映射到寄存器中;寄存器是作为执行算术和逻辑运算的操作数使用的实际硬件。有时,语义上等同但采用两种不同方式编写的代码可能会使优化器在执行良好的寄存器分配上所花费的时间相差巨大。循环展开是一个可能导致 JIT 分配寄存器出现问题的转换的例子。

C++ 编译器完成的循环展开可以公开更多的指令级并行,但也创建了更多活变量 (live variable),编译器需要使用它们来跟踪寄存器分配。CLR JIT 只能跟踪固定数目的寄存器分配变量;一旦需要跟踪的数目超出这个数目,它就开始将寄存器的内容移到内存中。

因此,必须先后对 Visual C++ 编译器和 JIT 进行微调以生成最佳代码。Visual C++ 编译器负责进行的优化是那些对 JIT 来说太耗时的优化,以及那些在从 C++ 源代码编译为 MSIL 的编译过程中会造成太多信息丢失的优化。

让我们看一下 Visual C++ 对托管代码的一些优化。

公共子表达式消除和代数简化

公共子表达式消除(Common subexpression elimination,CSE)和代数简化 (algebraic simplification) 是两个强大的优化,它们允许编译器在表达式级别执行一些基本优化,以便开发人员可以专注研究算法和体系结构。

下面显示的代码片段分别作为 C# 和 C++ 编译;二者都是在 Release 配置下编译的。变量 a、b 和 c 从一个作为参数传递的数组复制到包含这段代码的函数中:

以下是引用片段:
   int d = a + b * c;
  int e = (c * b) * 12 + a + (a + b * c);

图 1 显示了 C# 编译器和 C++ 编译器通过这段代码生成的 MSIL,它们都启用了优化。C# 需要 19 条指令,而 C++ 只需 13 条。另外,您可以看到 C++ 代码可以对 b*c 表达式进行 CSE。该编译器可以对 a+a 进行代数简化,即改为生成 2*a,也可以对 (c*b)*12 + c*b 进行代数简化,即改为生成 (c*b)*13。我发现增加的这个 CSE 特别有用,因为我见过编程人员在实际的代码中没有进行这种代数简化。请参阅补充内容“C# 编译器优化”。

时间: 2024-08-02 17:58:23

优化增强您的Visual C++应用程序的相关文章

jQuery 1.4:15个新特性和优化增强

jQuery 1.4 最近发布了. 超乎大家的预期,这次并非简单的修修补补,1.4 包含了很多新特性.功能增强和性能提升!本文即向您介绍这些可能对你十分有用的新特性和优化增强. 你可以立刻下载jQuery 1.4试用: http://code.jquery.com/jquery-1.4.js 1. 传参给 jQuery(-) 之前,jQuery可以通过 attr 方法设置元素的属性,既可传属性的名和值,也可以是包含几组特定 属性名值对 的 对象.在 jQuery 1.4 中,你可以把一个参数对象

Visual Basic .NET 和 Visual C# .NET 程序员需要解决的安全问题 (zt)

visual|安全|程序|程序员|解决|问题 Visual Basic .NET 和 Visual C# .NET 程序员需要解决的安全问题 Robin Reynolds-HaertleVisual Studio TeamMicrosoft Corporation 2002 年 1 月 摘要:本文着重讨论了 Visual Basic .NET 和 Visual C# .NET 开发人员在开始使用 .NET 框架时需要解决的主要安全问题.此概述讨论了 Windows 应用程序和 Web 应用程序,

第一个Visual Basic应用程序

第一个 Visual Basic 应用程序创建 Visual Basic 应用程序是很简单的事.有多简单?为回答这个问题,试着创建下面的 Hello , Visual Basic 和 Firstapp 应用程序. 你好,Visual Basic 创建 Visual Basic 应用程序有三个主要步骤: 1. 创建应用程序界面 2. 设置属性 3. 编写代码 为了说明这一实现过程,按照以下步骤创建一个简单应用程序,该应用程序由一个文本框和一个命令按钮组成.单击命令按钮,文本框中会出现"Hello

在Visual Web应用程序中使用Java Persistence API

借助 NetBeans IDE 6.0 和 Visual Web 工具,您可以使用 Visual Web 数据提供程 序组件以及 Java Persistence API(JPA)来编写连接到数据库表的应用程序.建立了到 数据库表的连接之后,可以使用 Java Persistence API 执行数据库 CRUD 操作(即创建 .读取.更新和删除操作).在开发基于数据库的应用程序时,使用 Java Persistence API 能提供更高的灵活性. 本文是本系列文章的第 1 篇(共两篇),主要

vs2008-打开VS2008出现visual assist 外接程序错误

问题描述 打开VS2008出现visual assist 外接程序错误 外接程序"Visual Assist "未能加载或导致了异常.是否希望移除外接程序? 错误信息:找不到指定的模块 错误号:8007007e 解决方案 应该是你的Visual Assist跟你的VS2008版本不兼容,其实现在的VS2012. VS2013功能已经很强大了,我都不再怎么用VA了 解决方案二: visual assist 安装的问题吧,换一个新版本的.或者明确支持 VS2008 的版本再试试 或者,就不

c++-visual stuido 2008 程序窗口启动最大化

问题描述 visual stuido 2008 程序窗口启动最大化 大家好,visual stuido 2008 编译后窗口总是显示在左上角不最大化,如何实现启动时就自动最大化呢?c++ 6.0是可以的,2010测试时与2008一样, 代码已自动显示: // 唯一的一个窗口已初始化,因此显示它并对其进行更新 m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED); m_pMainWnd->UpdateWindow(); 解决方案 试试看 SendMessage(主窗口

Visual Basic .NET 和 Visual C# .NET 程序员需要解决的安全问题 (z

Visual Basic .NET 和 Visual C# .NET 程序员需要解决的安全问题 Robin Reynolds-HaertleVisual Studio TeamMicrosoft Corporation 2002 年 1 月 摘要:本文着重讨论了 Visual Basic .NET 和 Visual C# .NET 开发人员在开始使用 .NET 框架时需要解决的主要安全问题.此概述讨论了 Windows 应用程序和 Web 应用程序,以及开发过程的实现.调试和部署阶段.本文适用于

关于增加富国优化增强债券型证券投资基金代销机构的公告

根据富国基金管理有限公司与中国银行股份有限公司.上海浦东发展银行股份有限公司.国泰君安证券股份有限公司签署的销售代理协议,自2009年5月18日起,上述公司开始代理销售富国基金管理有限公司旗下的富国优化增强债券型证券投资基金. 即日起,投资者可通过上述代销机构办理相关基金的开户.认购业务.投资者也可以通过以下途径咨询有关情况: (1)中国银行股份有限公司 注册地址:北京市西城区复兴门内大街1号 办公地址:北京市西城区复兴门内大街1号 法定代表人:肖钢 传真:(010)66594946 客户服务统

用户体验优化:增强网站与用户的互动性

文章描述:其实用户友好体验的页面设计的小的细节不仅仅以上三点,这些都只是一些抛砖引玉,作为站长我们需要的是站在用户的角度上思考问题才能创建一个更加符合用户友好体验的站点. 用户体验优化(UEO)这块是让人头疼的事,对于一个网站来说,如果没有足够吸引人的地方,那么这个网站很难存活下去.即使你的关键词子在搜索引擎有再好的排名,用户体验差也会让你失去最终的访客,同时连带而来的是一个高跳出率.回头率低的窘境.这一类的站点比比皆是,有的站点这样的网站做得比较早,网站的内容量很丰富,权重也比较高,但是当我们