VC++.NET 2003代码优化方法

概要:这篇文章介绍了Visual C++.NET 2003中的代码优化。另外,有些读者可能对VC.NET 2002的优化不太了解,所以我们会简短介绍一下全程优化(Whole Program Optimization)。最后我们用一些例子充分表现一下VC.NET的优化性能,并对其讨论。

前言

人们在使用一个新的编程工具时总会感到缺乏自信,本文试图让你对VC的代码优化有更直观的感觉,希望你能通过阅读本文从VC中"得到"更多的东西。

Visual C++ .NET 2003

VC.NET 2003不仅带来了两个新的优化选项,它还改进了VC.NET 2002中一些优化的性能。

第一个新增选项是"/G7",它告诉编译器对Intel Pentium 4和AMD Athlon处理器进行优化。

使用"/G7"选项编译的程序,当我们和VC.NET 2002生成的代码比较时发现,它通常能使典型的程序的运行速度提高5到10个百分点,如果使用了大量浮点代码甚至能提高10到15个百分点。而提高的优化程度可能很高也可能较低,在一些使用最新CPU和"/G7"选项的测试中,甚至提高了20%的性能。

使用"/G7"选项不代表生成的代码只能运行在Intel Pentium 4和AMD Athlon处理器上。这些代码仍可以运行在老的CPU上,只是在性能表现上可能有"小小的惩罚"。另外,我们观察到一些程序使用"/G7"后在AMD Athlon上运行的比用Intel Pentium 4更慢。

当没使用"/Gx"选项时,编译器会默认使用"/GB"选项,此时为"blended"优化模式。在VC.NET 2002和VC.NET 2003中,"/GB"代表"/G6",即为Intel Pentium Pro, Pentium II, Pentium III处理器优化。

这儿有一个例子,它展示了做与常整数乘法时使用Pentium 4和"/G7"的优化效果,下面是源代码:

程序代码:

int i;

// Do something that assigns a value to i.

return i*15;

当使用"/G6"时,生成了目标代码:

程序代码:
mov eax, DWORD PTR _i$[esp-4]
imul eax, 15

当使用"/G7"时,生成了更快(可惜更长)的代码,它没用imul(乘)指令,在Pentium 4上执行只需要14个周期。目标代码如下:
程序代码:

mov ecx, DWORD PTR _i$[esp-4]
mov eax, ecx
shl eax, 4
sub eax, ecx
第二个优化选项是"/arch:[argument]",用它可对SSE或SSE2优化,生成使用Streaming SIMD Extensions (SSE) 和 Streaming SIMD Extensions 2 (SSE2) 指令集的程序。当使用"/arch:SSE"选项时,目标代码只能运行在支持SSE指令(如:CMOV, FCOMI, FCOMIP, FUCOMI, FUCOMIP)的CPU上。当使用"/arch:SSE2"选项时,目标代码只能运行在支持SSE2指令集的CPU上。

相比于"/G7",使用了SSE或SSE2优化的程序,一般能减少2-3%的运行时间,个别测试中甚至能减少5%的运行时间。

使用"/arch:SSE"可得到以下效果:

1、在使用单精度浮点数时,使用SSE指令对其处理。

2、使用CMOV指令,它最早被Pentium Pro支持。

3、使用FCOMI, FCOMIP, FUCOMI, FUCOMIP指令,它们也是最早被Pentium Pro支持的。

使用"/arch:SSE2"的话,可以得到所有"/arch:SSE"选项的效果,另外还有以下几个效果:

1、在使用双精度浮点数时,使用SSE2指令对其处理。

2、使SSE2指令集做64位切换。(原文:Making use of SSE2 instructions for 64-bit shifts)

还有其它的好处,在同时使用"/arch:SSE"或"/arch:SSE2” 和 "/GL"(全程优化)选项选项时,编译器会对浮点参数和浮点返回值做函数调用规则优化。

上面说的几点优化特性已经包括于VC.NET 2003里了。另外还有一点就是能消除"死参数"--从没被用过的参数。比如:
程序代码:

int
f1(int i, int j, int k)
{
return i + k;
}

int
main()
{
int n = a+b+c+d;
m = f1(3, n, 4);
return 0;

在函数f1()中,第二个参数从没被使用过。当我们用"/GL"(全程优化)选项时,编译器将产生如下目标代码来调用f1():

程序代码:

mov eax, 4
mov ecx, 3
call ?f1@@YAHHHH@Z
mov DWORD PTR ?m@@3HA, eax
在这个例子里,变量"n"从没被运算,只有两个参数被f1()使用,所以只传递那两个参数(并且它们是从寄存器传过去的,这比使用栈传更快)。另外,编译这个例子时要禁止内联(inlining),否则函数f1()就不存在了,而直接给m赋予值7。

时间: 2024-10-16 21:47:35

VC++.NET 2003代码优化方法的相关文章

excel2007文档转换为2003的方法

  excel2007文档转换为2003的方法.很多网友下载的excel表格是.XLSX格式的,用电脑上安装的excel打不开.造成这个问题的原因是因为,你的电脑安装的是excel2003,而.XLSX格式的文档是excel2007的文档.那么,excel2007文档如何转换为2003呢?一起来看看今天的教程! 方法一: 直接另存文件为,在对话框选择97-2003excel,保存成功后就是低版本excel; 或者在另存为的右侧菜单直接选择97-2003即可,保存以后为2003版本,如首图; 方法

找回Word 2003工具栏方法

  找回Word 2003工具栏方法: 方法一.鼠标右键单击"菜单栏"或"工具栏"任意处,在弹出的下拉菜单中选择"自定义",弹出的"自定义"-->然后"工具栏",在这里面你可以看到里面有"工具栏"上所有的菜单,钩上然后确定即可(你也可以选择"重新设置",选择"Normal.dot"然后确定). 方法二.删除Normal.dot模板,直接利用系

vc++-JavaScript调用Flex方法

问题描述 JavaScript调用Flex方法 1.Flex里面使用ExternalInterface.call("Js函数名称",参数)进行调用javascript方法,其返回的值就是Js函数所返回的值. 2.在初始化方法中使用ExternalInterface.addCallback("注册的方法名",As中的函数名)进行注册,"注册的方法名"可以再javascript中直接调用 3.在js中,就可以用document.getElementB

两种快速登陆Windows Server 2003操作系统的方法

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; 如何快速的进入Windows 2003操作系统呢?在本文中我们将介绍两种快速登陆Windows 2003操作系统的方法: 一种方法比较简单,您只需单击"开始|运行",并在输入框中键入"control userpasswords2",这样就可以在"用户账户"管理窗口中清除"要使用本机,用户必须输入密

VC++ .NET 2003 –安装和使用Boost 1.30和Blitz++0.6

"C++ increasingly means Visual C++"        - Scott Meyers   < 文章的长度把握不是太好,被 CSDN 的系统裁减,所以接着再来 J >     接下来,我们需要编写一些小的应用测试一下,简单一点的 lexical_case : 取自 http://www.emaki.minidns.net/Programming/tools/Boost/ 的例子 使用下面的命令方式. D:\boost2> cl /GX /M

VC快速强制退出程序方法

首先为什么要快速强制退出应用程序. 1.想快点结束程序,关闭自己,节约时间 2.正常退出时(或者关闭窗口时)崩溃,出来一个对话框 "XXX已停止工作,Windows 正在检查该问题的解决方案-",一时找不到原因解决,总不能关闭的时候老看见这个框吧. 3.写的代码是给自己用的,不严格,所以如果正常退出,会调用一大堆析构函数,可能又涉及到多线程,必崩溃,这时就不得不考虑用快速简单粗暴的方法了. 4.快速退出程序没有多少影响,系统会帮你回收所有东西,所以不用担心内存泄露等, 唯一的影响就是你

C#代码优化方法

在编写基于.NET架构的应用程序,尤其是分布式时,我们常常极为关注应用程序的执行效率.如果掌握了如何编写高效率的代码,就能大幅度地提高应用程序的执行速度,并有助于减少应用程序的瓶颈(bottlenecks). 18.4.1 撤消 我们知道,类object是.NET架构中的其它一个类的基类.类object是在System中定义的,它并没有声明析构函数,而是定义了一个保护类型的成员方法Finalize. 如果.NET的运行时垃圾收集器认为一个对象可以安全从内存中移出时,垃圾收集器就调用该对象的撤消方

VC启动窗口画面制作方法研究

源代码运行效果图如下: 1. 概述 前几天在设计软件时,选择VC作为开发工具,想做个启动画面,由于以前没有制作过,所以到网上搜了一通.网上有几篇相关文章,有两篇我觉得很有价值:一篇是关于 为方便显示图像制作的CPicture类的文章,原文是由Paul DiLascia写的解答,很有影响力:还有一篇是关于制作真彩启动画面的文章,不过其限制对位图操作,而不支持jpg, gif,而且使用繁琐,基本上是对Splash Screen组件导入后的代码进行简单修改.琢磨了好大一会儿才学会使用. 有感于现有材料

VC中常用的方法

一.打开CD-ROM  mciSendString("Set cdAudio door open wait",NULL,0,NULL);  二.关闭CD_ROM  mciSendString("Set cdAudio door closed wait",NULL,0,NULL);  三.关闭计算机  OSVERSIONINFO OsVersionInfo; //包含操作系统版本信息的数据结构  OsVersionInfo.dwOSVersionInfoSize =