关键词:
8.2. 不同编译器的比较
我在7个不同品牌的C++编译器上进行了一系列实验,看它们是否能够进行各种优化。结果汇总在表8.1中。这个表展示了在我的测试例子中,不同的编译器是否成功应用了各种优化方法以及代数约简。
这个表可以给出哪些优化你可以预期一个特定的编译器会进行,哪些优化你必须手动进行的某些预示。
必须强调,在不同的测试例子上,编译器行为会不同。你不能预期编译器的行为总是符合这个表。
优化方法 | Microsoft | Borland | Intel | Gnu | PathScale | PGI | Digital Mars | Watcom | Codeplay |
函数内联 | x | - | x | x | x | x | - | - | x |
常量折叠 | x | x | x | x | x | x | x | x | x |
常量传播 | x | - | x | x | x | x | - | - | x |
指针消除 | x | x | x | x | x | x | x | x | x |
|
|
|
|
|
|
|
|
|
|
公共子表达式消除,整形 | x | (x) | x | x | x | x | x | x | x |
公共子表达式消除,浮点 | x | - | x | x | x | x | - | x | x |
寄存器变量,整形 | x | x | x | x | x | x | x | x | x |
寄存器变量,浮点 | x | - | x | x | x | x | - | x | x |
生命期分析 | x | x | x | x | x | x | x | x | x |
合并相同的分支 | x | - | - | x | - | - | - | x | - |
消除跳转 | x | x | x | x | x | x | - | x | x |
消除分支 | x | - | x | x | x | x | - | - | - |
删除总是true/false的分支 | x | - | x | x | x | x | x | x | x |
循环展开 | x | - | x | x | x | x | - | - | x |
循环不变代码移动 | x | - | x | x | x | x | x | x | x |
数组元素归纳变量 | x | x | x | x | x | x | x | x | x |
其他整型表达式归纳变量 | x | - | x | x | x | - | x | x | x |
浮点表达式归纳变量 | - | - | - | - | - | - | - | - | - |
自动向量化 | - | - | x | x | x | x | - | - | x |
去虚拟化 | - | - | - | x | - | - | - | - | - |
分析指引(profile-guided)优化 | x | - | x | x | x | x | - | - | - |
整体程序优化 | x | - | x | x | x | - | - | - | - |
|
|
|
|
|
|
|
|
|
|
整形代数约简: |
|
|
|
|
|
|
|
|
|
a+b = b+a | x | (x) | x | x | x | x | - | x | x |
a*b = b*a | x | (x) | x | x | x | x | - | x | x |
(a+b)+c = a+(b+c) | x | - | x | x | - | - | x | x | - |
a+b+c = c+b+a | x | - | - | x | - | - | - | - | - |
a+b+c+d = (a+b)+(c+d) | - | - | x | x | - | - | - | - | - |
a*b+a*c = a*(b+c) | x | - | x | x | x | - | - | - | x |
a*x*x*x + b*x*x + c*x + d = ((a*x+b)*x+c)*x+d | x | - | x | x | x | - | - | - | x |
x*x*x*x*x*x*x*x = ((x2) 2) 2 | - | - | x | - | - | - | - | - | - |
a+a+a+a = a*4 | x | - | x | x | - | - | - | - | x |
-(-a) = a | x | - | x | x | x | x | x | x | - |
a-(-b) = a+b | x | - | x | x | x | x | - | x | - |
a-a = 0 | x | - | x | x | x | x | x | x | x |
a+0 = a | x | x | x | x | x | x | x | x | x |
a*0 = 0 | x | x | x | x | x | x | x | - | x |
a*1 = a | x | x | x | x | x | x | x | x | x |
(-a)*(-b) = a*b | x | - | x | x | x | - | - | - | - |
a/a = 1 | - | - | - | - | x | - | - | - | x |
a/1 = a | x | x | x | x | x | x | x | x | x |
0/a = 0 | - | - | - | x | - | - | - | x | x |
(-a == -b) = (a == b) | - | - | - | x | x | - | - | - | - |
(a+c == b+c) = (a == b) | - | - | - | - | x | - | - | - | - |
!(a < b) = (a >= b) | x | x | x | x | x | x | x | x | x |
(a<b && b<c && a<c) = (a<b && b<c) | - | - | - | - | - | - | - | - | - |
乘以常量 = 偏移与加法 | x | x | x | x | - | x | x | x | - |
除以常量 = 乘法与偏移 | x | - | x | x | x | (-) | x | - | - |
|
|
|
|
|
|
|
|
|
|
浮点代数约简: |
|
|
|
|
|
|
|
|
|
查看详情
优化c++软件4.性能与可用性性能更好的软件产品是为用户节省时间。对许多计算机用户时间是宝贵的资源,在慢的、难用的、不兼容或易出错的软件上浪费了许多时间。所有这些问题是可用性问题,我相信应该在更宽广的可用性角度... 查看详情 优化c++软件——目录1.介绍 1.1.优化的代价2.选择最优的平台 2.1.硬件平台的选择 2.2.微处理器的选择 2.3.操作系统的选择 2.4.程序语言的选择 2.5.编译器的选择 2.6.函数库的选择 2.7.用户接口框架的选择 2.8.克服C++语言的缺点3.... 查看详情 优化c++软件1.介绍本手册面向希望使他们的软件更快的高级程序员与软件开发者。假定读者对C++编程语言掌握良好,并对编译器如何工作有基本的了解。选择C++语言作为基础的原因在下面第8页解释。本手册主要基于我对编译... 查看详情 优化c++软件7.6.指针与引用指针与引用指针与引用同样高效,因为它们实际上做相同的事情。例如://Example7.12voidFuncA(int*p) *p=*p+2;voidFuncB(int&r) r=r+2;这两个函数做同样的事情,如果你看编译器产生的代码ÿ... 查看详情 优化c++软件7.不同C++构造的效率对一段程序代码如何被翻译到机器码,以及微处理器如何处理这个代码,许多程序员知之甚少。例如,许多程序员不知道双精度计算与单精度计算一样快。有谁知道一个模板类比一个多态类... 查看详情 优化c++软件7.15.函数参数在大多数情形里,函数参数通过值传递。这意味着参数的值被拷贝到一个局部变量。对简单类型,比如int,float,double,bool,enum以及指针与引用,这是高效的。数组总是以指针传递,... 查看详情 优化c++软件8.5. 编译器优化选项所有C++编译器有各种你可以打开、关闭的优化选项。学习正在使用编译器可用的选项,并打开所有相关选项,是重要的。许多优化选项与调试不兼容。调试器可以一次执行一行代码,并显示... 查看详情 优化c++软件...译器上进行了一系列实验,看它们是否能够进行各种优化。结果汇总在表8.1中。这个表展示了在我的测试例子中,不同的编译器是否成功应用了各种优化方法以及代数约简。这个表可以给出哪些优化你可以预期一个特定... 查看详情 优化c++软件8.1.编译器里的优化8.1.编译器如何优化现代编译器可以对代码进行许多优化以提升性能。程序员知道编译器能做什么,不能做什么是有好处的。下面章节描述某些程序员应该知道的编译器优化。函数内联编译器可以将被调用... 查看详情 优化c++软件——目录1.介绍 1.1.优化的代价2.选择最优的平台 2.1.硬件平台的选择 2.2.微处理器的选择 2.3.操作系统的选择 2.4.程序语言的选择 2.5.编译器的选择 2.6.函数库的选择 2.7.用户接口框架的选择 2.8.克服C++语言的缺点3.... 查看详情 c++应用程序性能优化——应用程序性能优化简介C++应用程序性能优化(一)——应用程序性能优化简介一、程序性能优化简介1、程序性能优化简介在计算机发展的早期阶段,硬件资源相对而言是非常昂贵的,CPU运行时间与内存容量给程序开发人员设置了极大限制。因此,早... 查看详情 优化c++软件...,该循环将需要1000*100*5*0.5ns=250μs。我们应该尝试优化这个循环吗& 查看详情 c++应用程序性能优化C++应用程序性能优化C++应用程序性能优化系列博客主要依据《C++应用程序性能优化》(第2版)学习整理而来,同时参考部分网络博客。C++应用程序性能优化(一)——应用程序性能优化简介https://blog.51cto.com/9291927/2388608 查看详情 优化c++软件...或匿名对象。如果函数被内联,编译器可以很容易地优化掉一个const引用。一个替代的解决方案是使函数成为对象的类或 查看详情 c++应用程序性能优化——c++对象模型(代码片段)C++应用程序性能优化(二)——C++对象模型一、C++对象模型与性能优化对象模型是面向对象程序设计语言的重要方面,会直接影响面向对象语言编写程序的运行机制以及对内存的使用机制,因此了解对象模型是进行程序性能优化... 查看详情 C++ 分析和优化】C++分析和优化【英文标题】:C++profilingandoptimization【发布时间】:2013-02-2510:28:04【问题描述】:我的应用程序性能存在一些问题。我在***上找到了这个答案:https://***.com/a/378024/5363我喜欢。我不太明白的一点是代码优化和分析... 查看详情 C++ 向量操作优化】C++向量操作优化【英文标题】:C++vectormanipulationoptimization【发布时间】:2009-07-1618:17:29【问题描述】:我正在尝试优化下面的代码,以避免复制和粘贴,只需正确使用SlaveForce和SlavePos,它们是float[6]类型,而baseForce和basePos是矢... 查看详情 |