现在的位置: 首页 > 综合 > 正文

Optimizing Program Performance–Eliminating Unneeded Memory Reference

2013年12月13日 ⁄ 综合 ⁄ 共 1260字 ⁄ 字号 评论关闭

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

 

这段代码就简洁多了, 直接计算这个值就好了。 因为目标值是在寄存器中的。

 

 

 

抱歉!评论已关闭.