WEB开发网
开发学院软件开发汇编语言 简明x86汇编语言教程(7) 阅读

简明x86汇编语言教程(7)

 2010-01-10 09:37:35 来源:WEB开发网   
核心提示:表达式预计算并不会让程序性能有飞跃性的提升,但确实减少了运行时的计算强度,简明x86汇编语言教程(7)(3),除此之外,绝大多数编译器会把下面的代码: // [假设此时b, c, d, e, f, g, h都有一个确定的非零整数值,无论如何压栈,这些东西大概都得进内存(不可

表达式预计算并不会让程序性能有飞跃性的提升,但确实减少了运行时的计算强度。除此之外,绝大多数编译器会把下面的代码:

// [假设此时b, c, d, e, f, g, h都有一个确定的非零整数值,并且,
// a[]为一个包括5个整数元素的数组,其下标为0到4]

a[0] = b*c;
a[1] = b+c;
a[2] = d*e;
a[3] = b*d + c*d;
a[4] = b*d*e + c*d*e;

优化为(再次强调,编译器实际上是在中间代码的层次,而不是源代码层次做这件事情!):

// [假设此时b, c, d, e, f, g, h都有一个确定的非零整数值,并且,
// a[]为一个包括5个整数元素的数组,其下标为0到4]

a[0] = b*c;
a[1] = b+c;
a[2] = d*e;
a[3] = a[1] * d;
a[4] = a[3] * e;

更进一步,在实际代码生成过程中,一些编译器还会对上述语句的次序进行调整,以使其运行效率更高。例如,将语句调整为下面的次序:

// [假设此时b, c, d, e, f, g, h都有一个确定的非零整数值,并且,
// a[]为一个包括5个整数元素的数组,其下标为0到4]

a[0] = b*c;
a[1] = b+c;
a[3] = a[1] * d;
a[4] = a[3] * e;
a[2] = d*e;

在某些体系结构中,刚刚计算完的a[1]可以放到寄存器中,以提高实际的计算性能。上述5个计算任务之间,只有1, 3, 4三个计算任务必须串行地执行,因此,在新的处理器上,这样做甚至能够提高程序的并行度,从而使程序效率变得更高。

5.3 全局寄存器优化

[待修订内容] 本章中,从这一节开始的所有优化都是在微观层面上的优化了。换言之,这些优化是不能使用高级语言中的对应设施进行解释的。这一部分内容将进行较大规模的修订。

通常,此类优化是由编译器自动完成的。我个人并不推荐真的由人来完成这些工作——这些工作多半是枯燥而重复性的,编译器通常会比人做得更好(没说的,肯定也更快)。但话说回来,使用汇编语言的程序设计人员有责任了解这些内容,因为只有这样才能更好地驾驭处理器。

在前面的几章中我已经提到过,寄存器的速度要比内存快。因此,在使用寄存器方面,编译器一般会做一种称为全局寄存器优化的优化。

例如,在我们的程序中使用了4个变量:i, j, k, l。它们都作为循环变量使用:

for(i=0; i<1000; i++){
 for(j=0; j<1000; j++){
  for(k=0; k<1000; k++){
   for(l=0; l<1000; l++)
    do_something(i, j, k, l);
  }
 }
}

这段程序的优化就不那么简单了。显然,按照通常的压栈方法,i, j, k, l应该按照某个顺序被压进堆栈,然后调用do_something(),然后函数做了一些事情之后返回。问题在于,无论如何压栈,这些东西大概都得进内存(不可否认某些机器可以用CPU的Cache做这件事情,但Cache是写通式的和回写式的又会造成一些性能上的差异)。

上一页  1 2 3 4 5 6  下一页

Tags:简明 汇编语言 教程

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接