您的位置:软件 > 开发者网络 > 微软开发专栏 > Visual Studio.net专栏 > VC.net > 正文
VC++.NET 2003代码优化方法
[文章信息]
作者:cnss
时间:2003-08-16
出处:论坛
责任编辑:方舟
[文章导读]
本文试图让你对VC的代码优化有更直观的感觉,希望你能通过阅读本文从VC中得到更多的东西
advertisement
热点推荐
· 天极网软件频道改版调查
· 在ASP.NET程序中创建唯一序号
· 用JVM工具接口创建调试和分析代理
· Win 2000如何安装配置防火墙
· 防范Windows消息钩子的侵入
[正文]

1 2 3  下一页



  概要:这篇文章介绍了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。


1 2 3  下一页

·"WAP天极之IT新闻资讯,50万元等你拿"    ·天极WAP之游戏狂图,50万元等你下载


发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容阅读排行榜
  • 用ATL实现VC插件
  • 共享内存实现进程间大数据的交换
  • ATL简介
  • Internet上用ActiveX发布软件
  • WinSock网络通信程序设计入门
  • Visual C++实现二值图像处理
  • Windows Socket1.1 程序设计
  • Winsocket编程之套接字原理
  • Winsocket编程之TCP/IP体系结构
  • 主板超频特色技术GIGA技嘉篇
  • Win 2000如何安装配置防火墙
  • 防范Windows消息钩子的侵入
  • 性价比之选 AGP显卡的告别秀
  • 大学校园生活之聊天也疯狂
  • Fireworks制作GIF动画Banner
  • 金山打击外挂 遭网络游戏玩家起诉
  • 完全公测《开天》掀起滔滔巨浪
  • Advertisement

    天极无线
    待机彩图    >>更多
    多彩动画    >>更多
    美妙和弦    >>更多
    天使在唱歌
    壁虎漫步
    PrettyBoy
    LoveLoveLove
    我是你的小小狗
    单身情歌
    十面埋伏
    祝酒歌
    回心转意
    波斯猫
    太委屈
    S.H.E
    潘玮柏
    M2M
    蔡依林
    阿牛
    林志炫
    陈弈迅
    刀郎
    黑龙
    S.H.E
    陶晶莹
    情人玫瑰坊
    音乐风云
    新片速递
    神秘测试
    都市约会
    ·天极彩信天天精彩
    ·图铃梦工厂下载无限!
    ·找寻童真,卡通专题
    ·夏日激情交友社区!
    ·星座运程,预测人生

    CSEEK搜索