首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

xScale应用程序性能的优化策略(2)

xScale应用程序性能的优化策略(2)

(1)使用inline函数 多数编译器支持inline关键字。如果一个函数被设计成一个inline函数,那么在调用它们的地方将会用函数体来替代函数调用语句,这样将会彻底省去函数调用的开销。使用inline的最大缺点是函数在被多处调用时,代码量将增大。 (2)减少函数调用参数 根据ARM过程调用规范,4个以下的形参通过寄存器传递,第5个以上的形参通过存储器栈传递。显然,通过存储器栈传送参数的开销较大。函数调用形参限制在 4个以内,可以降低函数调用的开销。 (3)在Switch是一种使用普通的编程技术。编译器为之产生if-else-if嵌套代码,并按照顺序进行比较,发现匹配则跳到满足条件的语句执行。编程时,根据发生的相对频率排序,将最可能发生的情况放在第一位,最不可能的情况放在最后一位,可以提高Switch语句块的执行速度。 实际上,程序中if条件的处理也有类似的特性。 (4)避免使用C++的昂贵功耗 C++在支持软件工程、面向对象程序设计、结构化对C进行卓有成效的改进,但在代码尺寸、执行速度等方面比C语言差一些。C++的类机制与C语言的结构差别不大,但C++的多重继承、虚拟基类、模板和运行类型识别等特性对代码尺寸和运行效率有负面影响。对这些功能要慎重使用,可以通过试验测试其影响的大小。 (5)减少或避免执行耗时的操作 应用程序的主要执行时间通常花费在关键路径代码段或程序模块,关键路径程序模块往往包含循环或嵌套循环。减少循环或内层循环中昂贵操作的执行频率可以显著地提高应用程序的效率。常见的耗时操作有:I/O操作、文件访问、图形界面操作和系统调用等。 表2列出了XScale常见的I/O处理、系统调用和文件访问等昂贵操作的代价。 表2 XScale常见最昂贵操作的代码 操作类型代价(时钟周期/个) sprintf 828 fprintf 540 fread 552 fwrite 864 write 216 Read 216 除法 112 atoi 596 对于文件访问等操作,每次读入和写出一个较大的数据块,或使用内存映射技术访问文件,可以减少相关系统调用执行的次数,从而提高程序执行的性能。下面是一个使用这种优化技术的示例。 优化前代码: int data_in,int data_out; int file_in,file_out; … for(;;){ read(file_in,data_in,1); data_out=decode(%26;amp;data_in); write(file_out,%26;amp;data_out,1); } 优化后代码: int data_in[1024], int data_out[1024]; int file_in,file_out; … for(;;){ read(file_in,data_in,1024); } (6)用查表代替计算 在处理器资源紧张和存储器资源相对富余的情况下,可以用牺牲存储空间换取速度的方法。例如需要频繁计算正弦和余弦等函数数值时,可预先将函数值计算出来,置于内存,供以后查找。 2.4 高性能开发工具 应用程序的可执行代码通常由编译器编译产生的目标代码和链接程序从系统库提取的库例程两部分组成。 选择一种优化能力强的编译器和开发工具可以生成更加高效的代码。WindRiver Diab、GNU gcc、GNUpro和Intel XScale Compiler都针对XScale体系结构进行了优化。 嵌入式应用程序通常包含大量的系统函数调用。在XScale平台上的测试结果表明:MediaBench的应用程序大约有50%的执行时间花费在系统库函数,选用高效的系统运行库(runtime library)也可使应用程序的运行效率获得提升。如glibc库的缓冲区的大小是newlib的数十倍,所以在处理输入输出操作方面具有更高的效率。 2.5 特定于XScale体系结构的优化 (1)避免除法 XScale没有除法部件和整数除法指令,除法是由软件实现的。软件实现的除法效率很低,应该尽可能避免除法和计算余数等运算。有时可以将除法转变为乘法。下面两侧是除法操作优化的示例。 ①用关系运算符两边乘除数消除除法操作 优化前:if((x/y)>z) 优化后:if(x>(y*z)) ②将除法转换为乘常数和移位操作 优化前:v.x=(v1.x+v2.x+v3.x)/3 优化后:使用常数乘数0x5555转换成 v.x=(int)(((_int64)(v1.x+v2.x+v3.x)* (_int64)0x55555)>>16); (2)避免浮点运算 XScale没有实现浮点部件。浮点运算是通过系统库实现的,代价很高,通常也应该避免,有时可以转换成整数运算。包含浮点运算的库例程有格式化输入输出(scanf/printf)等。XScale中常见浮点运算的代价如表3所列。 表3 XScale常见浮点运算的代价 运算类型代价(时钟周期/个) 加法+ 400 乘法* 400 除法/ 560 (3)使用GPP和IPP库 XScale的很多硬件特性是针对多媒体嵌入式应用的特点而设计的,很难在编译器中支持这些特性。为此,Intel公司对多媒体处理、图形处理和数值运算的一些典型操作和算法进行了手工优化,设计成程序库,分别称为GPP/IPP库。这些库例程可以很好地发挥XScale硬件的计算潜能,达到很高的执行效率。用IPP库实现除法和平方根的性能如图2所示。 由图2可以看出,使用IPP/GPP库使相关操作的性能获得大幅提升。 3 性能优化策略 应用程序的性能优化与缩短开发周期、软件工程和OOP的目标之间通常存在矛质。嵌入式系统需要性能优,但性能优化需要人力物力投入,会增加开发时间,降低程序的可读性,排斥使用新的开发工具和编程语言。而软件工程的目标是使用高效的开发工具。编程语言和编程规范提高程序的可读性、可靠性,缩短开发周期,降低项目成本。为此应该在二者之间寻找一种平衡。通常可以采取以下策略和原则; ①将算法结构优化作为首选优化技术,设计高效的应用程序流程和算法; ②根据功能、性能差异和投资预算选择高效的编译器、系统运行库、图形库、中间件等; ③使用性能监测工具识别占主要执行时间的关键路径程序模块,采用一切优化手段对关键路径代码和程序模块进行优化,挖掘应用程序性能; ④非关键路径的流程控制代码按照软件工程的要求,采用高效率程序语言和开发工具实现,提高设计开发效率。使用编译器进行优化。 结语 XScale体系结构按照嵌入式应用的要求,采用Pentium系列微处理器设计技术和工艺设计的一款性能突出的ARM兼容嵌入式微处理器。XScale 体系结构引入了多种硬件特性增强处理器的性能,但也给应用程序优化带来了挑战。发挥XScale体系结构的性能,需要操作系统、编译器、运行库、连接程序和装载程序等各层系统软件的支持,需要在嵌入式项目的系统规范、开发工具选型、系统设计和编码等多个阶段考虑对应用程序进行优化。
返回列表