这部分的代码出自《深入理解计算机系统》(CS:APP)第五章,其目的是通过手工改变代码结构,而不是算法效率和数据结构优化,提高执行效率。有些编译器在某些优化选项下可能会做出类似的改动。
为了便于以后的查阅和使用,本文进行了摘录和简要分析,其中包含了一些个人理解。对于更深层次的原理如汇编、处理器结构等请参考原书。
大致地,越靠后的代码性能越好,版本6和7性能近似,版本6略好一些。二者均能达到版本1性能的10倍左右。
示例演示对于一个向量的所有元素完成一个运算。这个运算可以是所有元素的累加
#define IDENT 0 #define OP +
或这所有元素的累计乘积
#define IDENT 1 #define OP *
data_t代表一种数据类型,在这个示例中可以是int、float、double
typedef struct { long int len; data_t *data; } vec_rec, *vec_ptr;
对于vec_rec,有以下操作
创建向量
vec_ptr new_vec(long int len) { /* Allocate header structure */ vec_ptr result = (vec_ptr) malloc(sizeof(vec_rec)); if (!result) return NULL; /* Couldn’t allocate storage */ result->len = len; /* Allocate array */ if (len > 0) { data_t *data = (data_t *)calloc(len, sizeof(data_t)); if (!data) { free((void *) result); return NULL; /* Couldn’t allocate storage */ } result->data = data; } else result->data = NULL; return result; }