CSAPP:优化程序性能(一)

本文探讨了优化程序性能的关键因素,包括选择合适的算法和数据结构,理解编译器如GCC的优化能力。提到编译器的优化级别如-O1, -O2, -O3,并通过内存别名、函数调用和内联函数替换等概念解释优化过程。文章还介绍了性能度量标准——每元素周期数(CPE),用于评估和改进代码效率,举例说明了循环展开在前置和计算中的应用。" 130357065,9031757,Java敏感词过滤工具实现,"['Java', '敏感词过滤工具', '文本处理']
摘要由CSDN通过智能技术生成

编写高效程序需要做到以下几点:

第一,必须选择一组适当的算法和数据结构

第二,必须编写出编译器能够有效优化以转换高效可执行代码的源代码(理解优化编译器的能力和局限性很重要)

程序员必须在实现和维护程序的简单性和运算速度之间做出权衡,几分钟就能编写一个简单的插入程序,而一个高效的排序算法程序可能需要一天或更长时间来实现和优化,

大多数编译器,例如GCC向用户提供了一些对它们所使用的优化的限制,最简单的控制就是指定优化级别,以命令行选项-Og 使用一组基本的优化,或者-O1或者更高

(-O2或-O3),编译器必须很小心地对程序进行安全的优化,消除造成不希望的运行时行为的一些可能的原因,为了理解决定一种程序转换是否安全的难度,看看如下两个过程


内存别名使用

void twiddle1(long *xp, long *yp)
{
    *xp += *yp;
    *xp += *yp;
}

void twiddle2(long *xp, long *yp)
{
    *xp += 2 * *yp;
}

两个过程似乎有相同的行为,函数twiddle2的效率更高一些,因为它只需要3次内存引用,而twiddle1需要6次内存引用,不过考虑*xp等于*yp的情况,twiddle1的结果是*xp增加了4倍,而twiddle2的结果是*xp的值增加了3倍,编译器不知道函数会被如何调用,因为必须假设参数xp和yp必须相等,因此不可能产生twiddle2作为twiddle1的优化版本&
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值