Memory Reference是指通过指针来读取或者写入。 这样的话肯定比直接操作寄存器要慢,而且指令数还增加了。
如:
1 /* Direct access to vector data */
2 void combine3
(vec_ptr v, data_t *dest)
3 {
4 int i;
5 int length = vec_length(v);
6 data_t *data = get_vec_start(v);
7
8 *dest = IDENT;
9 for (i = 0; i < length; i++) {
10 *dest = *dest
OPER data[i];
11 }
12 }
1 /* Accumulate result in local variable */
2 void combine4
(vec_ptr v, data_t *dest)
3 {
4 int i;
5 int length = vec_length(v);
6 data_t *data = get_vec_start(v);
7 data_t x = IDENT;
8
9 *dest = IDENT;
10 for (i = 0; i < length; i++) {
11 x = x
OPER data[i];
12 }
13 *dest = x;
14 }
这两段代码的功能差不多
(有细微差别),但是性能上有很大的差别。
我们分别来看看这两段代码的汇编结果。
combine3
: type=INT, OPER = *
dest in %edi, data in %ecx, i in %edx, length in %esi
1 .L18: loop:
2 movl (%edi),%eax Read *dest
3 imull (%ecx,%edx,4),%eax Multiply by data[i]
4 movl %eax,(%edi) Write *dest
5 incl %edx i++
6 cmpl %esi,%edx Compare i:length
7 jl .L18 If <, goto loop
先要从dest中得到值,再计算,再写入dest中
combine4
: type=INT, OPER = *
data in %eax, x in %ecx, i in %edx, length in %esi
1 .L24: loop:
2 imull (%eax,%edx,4),%ecx Multiply x by data[i]
3 incl %edx i++
4 cmpl %esi,%edx Compare i:length
5 jl .L24 If <, goto loop
这段代码就简洁多了, 直接计算这个值就好了。 因为目标值是在寄存器中的。