前言
人们在使用一个新的编程工具时总会感到缺乏自信,本文试图让你对VC的代码优化有更直观的感觉,希望你能通过阅读本文从VC中"得到"更多的东西。
VisualC.NET2003
VC.NET2003不仅带来了两个新的优化选项,它还改进了VC.NET2002中一些优化的性能。
第一个新增选项是"/G7",它告诉编译器对IntelPentium4和AMDAthlon处理器进行优化。
使用"/G7"选项编译的程序,当我们和VC.NET2002生成的代码比较时发现,它通常能使典型的程序的运行速度提高5到10个百分点,如果使用了大量浮点代码甚至能提高10到15个百分点。而提高的优化程度可能很高也可能较低,在一些使用最新CPU和"/G7"选项的测试中,甚至提高了20%的性能。 财软联盟,fs119.net
使用"/G7"选项不代表生成的代码只能运行在IntelPentium4和AMDAthlon处理器上。这些代码仍可以运行在老的CPU上,只是在性能表现上可能有"小小的惩罚"。另外,我们观察到一些程序使用"/G7"后在AMDAthlon上运行的比用IntelPentium4更慢。
当没使用"/Gx"选项时,编译器会默认使用"/GB"选项,此时为"blended"优化模式。在VC.NET2002和VC.NET2003中,"/GB"代表"/G6",即为IntelPentiumPro,PentiumII,PentiumIII处理器优化。
这儿有一个例子,它展示了做与常整数乘法时使用Pentium4和"/G7"的优化效果,下面是源代码:
…
//Dosomethingthatassignsavaluetoi.
…
returni*15;
当使用"/G6"时,生成了目标代码:
moveax,DWORDPTR_i$[esp-4]
imuleax,15
当使用"/G7"时,生成了更快(可惜更长)的代码,它没用imul(乘)指令,在Pentium4上执行只需要14个周期。目标代码如下:
movecx,DWORDPTR_i$[esp-4]
moveax,ecx
shleax,4
subeax,ecx
第二个优化选项是"/arch:[argument]",用它可对SSE或SSE2优化,生成使用StreamingSIMDExtensions(SSE)和StreamingSIMDExtensions2(SSE2)指令集的程序。当使用"/arch:SSE"选项时,目标代码只能运行在支持SSE指令(如:CMOV,FCOMI,FCOMIP,FUCOMI,FUCOMIP)的CPU上。当使用"/arch:SSE2"选项时,目标代码只能运行在支持SSE2指令集的CPU上。
相比于"/G7",使用了SSE或SSE2优化的程序,一般能减少2-3%的运行时间,个别测试中甚至能减少5%的运行时间。
使用"/arch:SSE"可得到以下效果:
财管家园,fs119.net
1、在使用单精度浮点数时,使用SSE指令对其处理。
2、使用CMOV指令,它最早被PentiumPro支持。
3、使用FCOMI,FCOMIP,FUCOMI,FUCOMIP指令,它们也是最早被PentiumPro支持的。
使用"/arch:SSE2"的话,可以得到所有"/arch:SSE"选项的效果,另外还有以下几个效果:
1、在使用双精度浮点数时,使用SSE2指令对其处理。
2、使SSE2指令集做64位切换。(原文:MakinguseofSSE2instructionsfor64-bitshifts)
还有其它的好处,在同时使用"/arch:SSE"或"/arch:SSE2”和"/GL"(全程优化)选项选项时,编译器会对浮点参数和浮点返回值做函数调用规则优化。
上面说的几点优化特性已经包括于VC.NET2003里了。另外还有一点就是能消除"死参数"--从没被用过的参数。比如:
int
f1(inti,intj,intk)
财软联.盟.fs119.net
{
returnik;
}
int
main()
{
intn=abcd;
m=f1(3,n,4);
return0;
}
在函数f1()中,第二个参数从没被使用过。当我们用"/GL"(全程优化)选项时,编译器将产生如下目标代码来调用f1():
moveax,4
movecx,3
call?f1@@YAHHHH@Z
movDWORDPTR?m@@3HA,eax