csapp-Program Optimization-review

Program-Optimization收获和思考

Generally Useful Optimizations

  1. 对于循环内重复计算的值,将其提前移动到循环外
  2. 使用加减运算、位运算代替乘除运算和取模运算

Optimization Blockers

  1. 循环遍历数组元素时,提前计算数组的长度而非在每次循环中单独计算数组的长度
  2. 避免aliasing(混淆)问题:数据在内存中的分布是随机的,因此两种类型相同的数据所占用的空间可能是发生重叠的,如 int * a和int * b,因此为了避免因为alias导致最终运算结果出错,可以通过引入多个局部变量来保留中间结果,在最后一步进行结果的赋值

Exploiting Instruction-Level Parallelism

  1. 在机器层面,一个指令的执行包含多个阶段,我们可以通过良好的代码风格来使线性的指令序列以一种紧密流水线的形式来减少多个指令所花费的时间,举例来说,假设当前有2个指令a,b,每个指令需要花费两个阶段,如果将b指令的一阶段和a指令的二阶段同时进行(即使是流水线,也不能影响指令执行的线性关系),因此紧密流水线下执行2个指令消耗3个阶段的时间,相比于线性执行下消耗4个阶段要节省1个阶段的时间
    注意:除法运算是没法使用流水线形式执行的
  2. 在使用循环时,我们可以通过在循环中添加单次循环执行的指令个数的方式来减少整体的循环次数,而多个线性指令则可以以紧密流水线的形式优化指令的执行时间,从而降低整个循环消耗的时间
int a[10];
int sum = 0;
for(int i = 0; i < 10; i++) {
	sum += a[i];
}
for(int i = 0; i < 10; i+=2) {
	sum += a[i];
	sum += a[i+1];
}
// 相比较而言,第二种方式的循环消耗的时间要更小
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

囚蕤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值