的优化代码的
民生娱乐 2021-08-24 18:36 字号: 大 中 小
前言
人们在使用一个新的编程工具时总会感到缺乏自信,本文试图让你对VC的代码优化有更直观的感觉,希望你能通过阅读本文从VC中\"得到\"更多的东西。
Visual C++ .NET 2003
2003不仅带来了两个新的优化选项,它还改进了 2002中一些优化的性能。
第一个新增选项是\"/G7\",它告诉编译器对Intel Pentium 4和AMD Athlon处理器进行优化。
使用\"/G7\"选项编译的程序,当我们和 2002生成的代码比较时发现,它通常能使典型的程序的运行速度提高5到10个百分点,如果使用了大量浮点代码甚至能提高10到15个百分点。而提高的优化程度可能很高也可能较低,在一些使用最新CPU和\"/G7\"选项的测试中,甚至提高了20%的性能。
使用\"/G7\"选项不代表生成的代码只能运行在Intel Pentium 4和AMD Athlon处理器上。这些代码仍可以运行在老的CPU上,只是在性能表现上可能有\"小小的惩罚\"。另外,我们观察到一些程序使用\"/G7\"后在AMD Athlon上运行的比用Intel Pentium 4更慢。
当没使用\"/Gx\"选项时,编译器会默认使用\"/GB\"选项,此时为\"blended\"优化模式。在 2002和 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优化的程序,一般能减少%的运行时间,个别测试中甚至能减少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\"(全程优化)选项选项时,编译器会对浮点参数和浮点返回值做函数调用规则优化。
上面说的几点优化特性已经包括于 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。
Visual C++ .NET 2002
2002引入了全程优化(Whole Program Optimization,缩写为WPO)的概念,\"/GL\"选项代表使用全程优化。全程优化意味着:编译器在.obj文件中存放的是代码的中间表达而不是目标代码,在连接时连接器对其优化处理并生成真正的目标代码。
全程优化的一个主要好处在于我们可以跨越源文件进行函数内联,这将大大提高程序的性能。还有一个好处在于编译器可以跟踪内存和寄存器的使用,以便优化使函数调用的开销更小。
查看本文来源
南通哪家白癜风医院好朗圣丹媚有副作用吗
宝宝消化不良的症状
-
-
观点孔蒂是大顶尖教练之一切尔西有他太幸运搭配
观点:孔蒂是大顶尖教练之一 切尔西有他太幸运埃梅内洛:孔...
2020-05-28 | 民生娱乐
-
-
观山湖区加强防护巡查确保道路安全
观山湖区加强防护巡查 确保道路安全连日来因强降雨天气导致...
2019-12-17 | 民生娱乐
-
-
介休市举办法治大讲堂
介休市举办法治大讲堂运用法治思维方式维护社会和谐稳定9月...
2019-07-16 | 民生娱乐
-
-
遂宁市船山区民政局组织全区民政系统工作人
遂宁市船山区民政局组织全区民政系统工作人员开展综合减灾...
2019-07-15 | 民生娱乐
-
-
扎兰屯市民政局召开两学一做学习教育常态化
扎兰屯市民政局召开“两学一做”学习教育常态化制度化推进...
2019-07-12 | 民生娱乐
-
-
沙土镇各党支部召开专题组织生活会
沙土镇各党支部召开专题组织生活会近日沙土镇组织各党支部...
2019-07-07 | 民生娱乐