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];
}
// 相比较而言,第二种方式的循环消耗的时间要更小

你可能感兴趣的:(csapp,csapp,optimization)