没有合适的资源?快使用搜索试试~ 我知道了~
使用gcc和glibc来优化程序 转载.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 34 浏览量
2023-03-07
20:25:45
上传
评论
收藏 797KB PDF 举报
温馨提示
试读
31页
.
资源推荐
资源详情
资源评论
使用 gcc 和 glibc 来优化程序 转载
使用 gcc 和 glibc 来优化程序(转载)2011-01-12 17:38Optimize
Applications with gcc and glibc by Ulrich Drepper 1.介绍
===
本文总结一些关于代码优化的经验,这些经验是不完整的.
本文不是讨论编译器如何优化代码,后者是完全不同的另外一个领域.
2.编译时优化(Using Optimizations Performed at Compile-Time)
=====
2.1 消除无用代码(Dead Code Elimination)
Dead Code 指永远不会执行的代码.
例如:
long int add(long int a,void*ptr,int type)
{
if(type==0)
return a+*(int*)ptr;
else return a+*(long int*)ptr;
}
这个函数根据 type 的值来判断 ptr 的类型,从而求和.
优化 1:多数情况下 int 和 long int 是相同的,因此可以优化为
long int add(long int a,void*ptr,int type)
{
if(sizeof(int)==sizeof(long int)||(type==0))
return a+*(int*)ptr;
else return a+*(long int*)ptr;
}
sizeof 运算总是在编译时进行,因此增加的条件表达式总是在编译时计算.
如果 long int 和 int 确实相同,那么这个函数就可以被编译器优化.
进一步优化,利用 limits.h 中定义的宏
#include limits.h long int add(long int a,void*ptr,int type)
{
#if LONG_MAX!=INT_MAX if(type==0)
return a+*(int*)ptr;
else
#endif return a+*(long int*)ptr;
}
这样,即便在 long int 不同于 int 的平台上,该函数也被优化了
2.2 节省函数调用(Saving Function Calls)
很多函数很短小,相对函数执行的时间,函数调用的代价不可忽视.例如
标准库中的字符串函数和数学函数.解决办法有两个:使用宏代替函数,
或者用 inline 函数.
一般而言,inline 函数和宏一样快,但是更安全.但是如果用到 alloca 和
__builtin_constant_p 的时候,可能要考虑用优先使用宏了
但是,如果函数被声明为 extern,inline 并不总是有效了.另外,当 gcc 的
编译优化选项没有打开时,gcc 不会展开 inline 函数.
如果 inline 函数是 static 的,那么编译器总是会展开该函数,不考虑是否
真的值得.尤其是当使用-Os(optimize for space)选项时,static inline
函数是否值得使用就是个问题了.
编写正确而又安全的宏并不容易.要注意
a)正确使用括号括起参数,
例如
#define mult(a,b)(a*b)//错误
#define mult(a,b)((a)*(b))
b)宏定义中的大括号引入新的 block,这有时侯会导致问题.
例如
#define scale(result,a,b,c)\
{\
int c__=(c);\
*(result)=(a)*c__+(b)*c__;\
}
下面的代码编译会出现问题:
if(.)
scale(r,a,b,c);///多余的分号导致编译错误 else else
{
}
正确的写法应该是:
#define scale(result,a,b,c)\
do{\
int c__=(c);\
*(result)=(a)*c__+(b)*c__;\
}while(0)
c)如果参数是表达式并且在宏定义中出现多次,尽量避免重复计算.
这也是上面例子中要引入变量 c__的原因.但这会限制变量 c__的类型.
d)宏缺乏返回值
2.3 编译器内部函数(Compiler Intrinsics)
绝大部分 C 编译器都知道内部函数(Intrinsic functions).它们是特殊的
inline 函数,由编译器提供使用.这些函数用外部实现来代替.
gcc2.96 的内部函数有
*__builtin_alloca:动态分配栈上内存
dynamiclly allocate memory on the stack
*__builtin_ffs:
find first bit set
*__builtin_abs,__builtin_labs:
absolute value of an integer
*__builtin_fabs,__builtin_fabsf,__builtin_fabsl absolute value of
floating-point vlaue
*__builtin_memcpy copy memory region
*__builtin_memset set memory region to give value
*__builtin_memcmp compare memory region
*__builtin_strcmp
*__builtin_strcpy
*__builtin_strlen
*__builtin_sqrt,__builtin_sqrtf,__builtin_sqrtl
*__builtin_sin,__builtin_sinf,__builtin_sinl
*__builtin_cos,__builtin_cosf,__builtin_cosl
*__builtin_div,__builtin_ldiv integer division with rest
*__builtin_fmod,__builtin_frem module and remainder of floating-
point value
剩余30页未读,继续阅读
资源评论
不吃鸳鸯锅
- 粉丝: 8253
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- #P0015. 全排列 超级简单
- pta题库答案c语言之排序4统计工龄.zip
- pta题库答案c语言之树结构7堆中的路径.zip
- pta题库答案c语言之树结构3TreeTraversalsAgain.zip
- pta题库答案c语言之树结构2ListLeaves.zip
- pta题库答案c语言之树结构1树的同构.zip
- 基于C++实现民航飞行与地图简易管理系统可执行程序+说明+详细注释.zip
- pta题库答案c语言之复杂度1最大子列和问题.zip
- 三维装箱问题(Three-Dimensional Bin Packing Problem,3D-BPP)是一个经典的组合优化问题
- 以下是一些关于Linux线程同步的基本概念和方法.txt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功