知识大全 Viusal C++.NET的优化代码
Posted 知
篇首语:做一个决定,并不难,难的是付诸行动,并且坚持到底。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Viusal C++.NET的优化代码相关的知识,希望对你有一定的参考价值。
Viusal C++.NET的优化代码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
前言 人们在使用一个新的编程工具时总会感到缺乏自信 本文试图让你对VC的代码优化有更直观的感觉 希望你能通过阅读本文从VC中 得到 更多的东西 Visual C++ NETVC NET 不仅带来了两个新的优化选项 它还改进了VC NET 中一些优化的性能 第一个新增选项是 /G 它告诉编译器对Intel Pentium 和AMD Athlon处理器进行优化 使用 /G 选项编译的程序 当我们和VC NET 生成的代码比较时发现 它通常能使典型的程序的运行速度提高 到 个百分点 如果使用了大量浮点代码甚至能提高 到 个百分点 而提高的优化程度可能很高也可能较低 在一些使用最新CPU和 /G 选项的测试中 甚至提高了 %的性能 使用 /G 选项不代表生成的代码只能运行在Intel Pentium 和AMD Athlon处理器上 这些代码仍可以运行在老的CPU上 只是在性能表现上可能有 小小的惩罚 另外 我们观察到一些程序使用 /G 后在AMD Athlon上运行的比用Intel Pentium 更慢 当没使用 /Gx 选项时 编译器会默认使用 /GB 选项 此时为 blended 优化模式 在VC NET 和VC NET 中 /GB 代表 /G 即为Intel Pentium Pro Pentium II Pentium III处理器优化 这儿有一个例子 它展示了做与常整数乘法时使用Pentium 和 /G 的优化效果 下面是源代码 int i; … // Do something that assigns a value to i … return i* ; 当使用 /G 时 生成了目标代码 mov eax DWORD PTR _i$[esp ] imul eax 当使用 /G 时 生成了更快(可惜更长)的代码 它没用imul(乘)指令 在Pentium 上执行只需要 个周期 目标代码如下 mov ecx DWORD PTR _i$[esp ] mov eax ecx shl eax sub eax ecx 第二个优化选项是 /arch:[argument] 用它可对SSE或SSE 优化 生成使用Streaming SIMD Extensions (SSE) 和 Streaming SIMD Extensions (SSE ) 指令集的程序 当使用 /arch:SSE 选项时 目标代码只能运行在支持SSE指令(如 CMOV FI FIP FUI FUIP)的CPU上 当使用 /arch:SSE 选项时 目标代码只能运行在支持SSE 指令集的CPU上 相比于 /G 使用了SSE或SSE 优化的程序 一般能减少 %的运行时间 个别测试中甚至能减少 %的运行时间 使用 /arch:SSE 可得到以下效果 在使用单精度浮点数时 使用SSE指令对其处理 使用CMOV指令 它最早被Pentium Pro支持 使用FI FIP FUI FUIP指令 它们也是最早被Pentium Pro支持的 使用 /arch:SSE 的话 可以得到所有 /arch:SSE 选项的效果 另外还有以下几个效果 在使用双精度浮点数时 使用SSE 指令对其处理 使SSE 指令集做 位切换 (原文 Making use of SSE instructions for bit shifts) 还有其它的好处 在同时使用 /arch:SSE 或 /arch:SSE 和 /GL (全程优化)选项选项时 编译器会对浮点参数和浮点返回值做函数调用规则优化
上面说的几点优化特性已经包括于VC NET 里了 另外还有一点就是能消除 死参数 从没被用过的参数 比如 int f (int i int j int k) return i + k; int main() int n = a+b+c+d; m = f ( n ); return ; 在函数f ()中 第二个参数从没被使用过 当我们用 /GL (全程优化)选项时 编译器将产生如下目标代码来调用f () mov eax mov ecx call ?f @@YAHHHH@Z mov DWORD PTR ?m@@ HA eax 在这个例子里 变量 n 从没被运算 只有两个参数被f ()使用 所以只传递那两个参数(并且它们是从寄存器传过去的 这比使用栈传更快) 另外 编译这个例子时要禁止内联(inlining) 否则函数f ()就不存在了 而直接给m赋予值 Visual C++ NET VC NET 引入了全程优化(Whole Program Optimization 缩写为WPO)的概念 /GL 选项代表使用全程优化 全程优化意味着 编译器在 obj文件中存放的是代码的中间表达而不是目标代码 在连接时连接器对其优化处理并生成真正的目标代码 全程优化的一个主要好处在于我们可以跨越源文件进行函数内联 这将大大提高程序的性能 还有一个好处在于编译器可以跟踪内存和寄存器的使用 以便优化使函数调用的开销更小 下面的代表展示了全程优化的表现 // File extern void func (int * int *); int g h; int main() int i = ; int j = ; g = ; h = ; func(&I &j); g = g + i; h = h + i; return ; // File extern int g; extern int h; void func(int *pi int *pj) *pj = g; h = *pi; 当不使用 /GL 选项时 生成了如下代码 sub esp lea eax DWORD PTR _j$[esp+ ] push eax lea ecx DWORD PTR _i$[esp+ ] push ecx mov DWORD PTR _i$[esp+ ] mov DWORD PTR _j$[esp+ ] mov DWORD PTR ?g@@ HA mov DWORD PTR ?h@@ HA call ?func@@YAXPAH @Z mov eax DWORD PTR _i$[esp+ ] mov edx DWORD PTR ?g@@ HA mov ecx DWORD PTR ?h@@ HA add edx eax add ecx eax mov DWORD PTR ?g@@ HA edx mov DWORD PTR ?h@@ HA ecx xor eax eax add esp ret 当使用了 /GL 时 你会看到下面的代码 现在的代码短多了 注意编译这个例子时同样要注意关掉内联优化 sub esp lea ecx DWORD PTR _j$[esp+ ] lea edx DWORD PTR _i$[esp+ ] mov DWORD PTR _i$[esp+ ] mov DWORD PTR ?g@@ HA mov DWORD PTR ?h@@ HA call ?func@@YAXPAH @Z mov DWORD PTR ?g@@ HA xor eax eax add esp cha138/Article/program/net/201311/13056相关参考
代码最优化.NET中的内存管理 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在NET中内存管理
通过代码学习C#&.NET——委托使用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 代码编写及
C#ADO.NET操作数据代码汇总 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一.用SqlC
优化PHP代码的建议 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Ifamethodcanbe
Java程序性能优化-代码调优 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 代码调
Java循环与字符串代码优化 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在系统性能优化的时候
知识大全 Java中利用Reflection API优化代码
Java中利用ReflectionAPI优化代码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
这篇文章介绍了net输出重写压缩页面文件的小例子有需要的朋友可以参考一下 不知你是否留意过有一些网站的代码都是混在一起没有任何空格和换行等多余字符它的好处不用多说——界面大小绝对优化或许
.Net课堂:ASP.NET常用的优化性能方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 数
优化.NET的性能 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! )避免使用ArrayList