经过几天的学习调试,将某个算法转换成了汇编程序,经过profile,发现需要的指令数提高了4倍。。。。。。泪流满面。。。。。。
经过这个过程我了解到一些事情:
首先基于汇编的人工优化主要是使用特殊的指令,在特殊的寻址或运算中,如果有对应的指令(扩展的指令集),效率会大幅提高,但是这个C程序本身已经是很优化了,只有简单的加减移位等操作,如果只是用基本的汇编指令的话,人工优化很难比编译器优化的好。这次的优化过程,同样的函数,编译器(O2选项)编译出来是38条指令,而我写出来的是62条指令。
另外函数的各个参数的入栈出栈也比较消耗指令数,在这一点上,宏函数的性能就好很多。
在用time命令测试程序运行时间时,尽管处理数据量增加了10倍,但运行时间只增加了12%,这说明此程序的瓶颈已经不是CPU了,时间主要都花费在读入数据上面了。
汇编程序的问题主要出在三个方面:一是许多寄存器不能随便使用;二是函数参数入栈的顺序,既函数参数在栈中的位置;三是跳转指令后面要跟一条nop。
虽然优化的结果比较失败,不过我还是对函数的效率有了直观的认识,对反汇编等文件也有了一定的了解,对程序的运行细节的认识也深入了很多,包括参数的传递,参数的入栈等。