资源预览内容
第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
亲,该文档总共4页全部预览完了,如果喜欢就下载吧!
资源描述
ABAP程序运行效率(转)程序的效率是每个程序员都应该重视的,无论您是采用哪一种语言进行开发. 程序有时候越短,并不 一定越快,有时候程序很多代码,但不一定会很慢. 性能是一把双刃剑, 获得时间效率的同时, 牺牲 的是空间的开销. 这里提供一些建议以提高你的程序运行速度和减低系统荷载。首先是尽量减少I/O操作,类似对硬盘的读写的I/O操作是最耗费时间的,比如读写数据库。以下是 减少 I/O 操作的例子:1, 减少数据库DB的读写操作,当使用VIEW视图的时候,当被视图join的table有数据更新操作的 时候 同时系统也会更新到这个view里面,使得它们之间的数据一样,所以使用视图会对这些日常操 作带来效率问题.如果视图join的表多数是日常事物需要更新的事物数据表(如EKET),就要避免 使用视图.2, 避免使用SELECT *,尽量使用SELECT A B C INTO TABLE ITAB这样的语句。这个操作会将所 有符合条件的数据一次性地读进内表,这比在SELECT A B C INTO WA. APPEND. ENDSELECT的循 环中添加数据到内表要快。不用频繁的读DB.3, 避免频繁使用SELECT SINGLE语句,特别是在LOOP和SELECT.ENDSELECT里面用,应该把 要读取的数据用 SELECT FOR ALL ENTRIES IN 一次全部取得,然后用 READ TABLE WITH KEY . BINARYSEARCH.虽然说操作内存比磁盘操作要高效,但是如果对内存的使用不加以控制,可能有些时候不得不对硬盘 的交换空间操作,这样就增加了对磁盘的I/O读写操作正如下面所说:4, 当你定义内表的时候可以也会出现这样的问题,比如你定义一个内表使用的是OCCURS 100,而不 是 OCCURS 0, 会导致内表长度大于 100的时候,就会占用系统页面缓存。5, Field-groups 对于多层次的排序和显示是非常有用的。它是将数据写入系统的页面文件,而不是 内存(内表一般是使用内存的)。基于这个原因, field-groups 比较适合于处理大量数据的列表( 一般超过 50000条记录)。如果涉及大量的数据处理,应该首先和系统管理员协商来决定这个程序 最多能使用多少内存,以计算这个程序需要使用多少资源。然后你就可以决定是把数据写入内存还是 交换空间。6, 用SORT代替ORDER BY, ORDER BY从句是执行在数据库服务器上,而SORT是ABAP语句执 行在应用服务器上的. 数据库服务器通常会形成性能瓶颈问题, 所以最好是吧数据导入内表做 SORT.7, 避免使用SELECT DISTINCT语句,因为当你用来判断唯一的字段为非索引字段时,效率是十分的低,所以请导入内表SORT后,使用DELETE ADJACENT DUPLICATES来去重复.其次就是要减轻CPU的负载,可以通过优化程序来改善,比如在程序中语句和算法,以下是减低CPU负载的优化例子:1, 使用宏代替频繁函数调用.ABAP没有内联函数这个说法,所以我们如果需要频繁调用函数时,函 数调用有栈内存创建和释放的开销.在ABAP中可以用宏代码提高执行效率,宏代码不是函数但使 用 起来像函数,编译器用复制宏代码的方式取代函数调用,省去了参数压栈、从而提高速度。注意使 用宏有缺点:(1)容易出错,宏不能pass-by-value按值传递,用于代替实现函数功能时要十分注意 !(2)不可调试; (3)无法操作类的私有数据成员.2, 避免使用过得的LOOP和SELECT . END SELECT.避免使用嵌套的LOOP和SELECT . END SELECT.3, 尽可能多地使用表的KEY FIELD作为 Where分句的条件选项。比如SELECT * FROM BSEG WHEREBUKRS = '1000' AND BELNR = '0100000007' AND GJAHR ='2006' AND BUZEI = '003'.这里的四个字段BUKRS,BELNR,GJAHR,BUZEI 都是BSEG表的KEY字段.4, 如果某些数据需要频繁的从不同表提取,使用视图VIEW实现读取缓存可以提高效率.当视图连 接的是读取次数较多,但写入不频繁的表时(比如物料主数据表MARA),可以使用视图,这样比在程序 里面简单用join要快,理论上join语句每次读取的速度都是一样的,而视图是从读二次开始就快了, 而且 cache 使得网络负载减低.5, 使用SQL语句里面的JOIN时候,应该避免JOIN的表不要超过3 个,否则严重影响效率.如果真 的要JOIN表3个以上的话,正确的方法不是用视图VIEW,而是使用SELECT . INTO TABLE . FOR ALLENTRIES IN以及READ TABLE WITH KEY BINARY SEARCH例如我们要提高读取BSEG表的性 能,首先我们会根据GJAHR主键从BKPF表取出部分数据到内表itab,然后使用FOR ALL ENTRIES IN itab WHEREBSEGBELNR = itabBELNR这样的的方法取得符合itab里所有条件的BSEG数据.注意使用FOR ALLENTRIES要先CHECK作为条件的内表itab是否为空,还有作为WHERE的条件在这个内表里面是否会有空值存在,否则无效.6, 注意使用 CORRESPONDING FIELDS OF 和 MOVE-CORRESPONDING 时候会进行字段比较, 带来 CPU 的开销大.7,避免过得而频繁的数据类型转换,比如N转换为C,但是从N转换成STRING却是很快的,因为操作 STRING比CHAR类型少了比较长度的时间.&使用二级索引提高DDIC的读写效率,可以根据你的需要在SE11里面创建INDEX,并让你程序里 的SQL查询语句里WHERE条件的顺序与你的索引顺序一致.9, 二分查找比线性查找要高效,READ TABLE的之前使用SORT TABLE BY XXX某个表关键字段 进行排序, 然后使用 READ TABLE WITH KEY XXX = 'XXX' BINARY SEARCH. 这个就是所 谓的二分 查找法的应用.10, 避免使用SQL语句动态查询条件,动态表名和动态字段名,必要时候用宏或者子程序模块代替.11, 对于同一功能的函数和方法,调用METHOD比调用FUNCTION要快.12, SORTED TABLE可以使用二分查找法取得节点,其时间复杂度是O(log N),但是插入节点会慢, 因为要移动很多节点.而HASHED TABLE则是基于哈希算法的,其高效主要体现在把数据的存储和查 找时间大大降低,几乎可以看成是常数时间O(1),而代价是消耗比较多的内存,然而在硬件技术越来越 发达的今天,用空间换时间的做法在某种意义上是值得的。但是使用哈希表必须注意键值的唯一性 !如果键值会出现重复的话, 不能使用哈希表,只能用排序表和标准表。13, 使用 APPEND LINES(或者 INSERT LINES) OF ITAB1 TO ITAB2 比 LOOP AT ITAB1 INTO WA. APPEND(INSERT) WA TO ITAB2. ENDLOOP. 要高效.14, 使用效率比较高的 COLLECT, DELETE ADJACENT DUPLICATES FROM语句。15, 使用高效的CONTEXT SQL语句.如以下代码2比代码1要快10倍以上! 代码 1:SELECT * FROM SBOOK INTO SBOOK_WA UP TO 10 ROWS.SELECT SINGLE AIRPFROM AIRPTO INTO (AP1, AP2)FROM SPFLIWHERE CARRID = SBOOK_WA-CARRIDAND CONNID = SBOOK_WA-CONNID.SELECT SINGLE NAME INTO NAME1 FROM SAIRPORTWHERE ID = AP1.SELECT SINGLE NAME INTO NAME2 FROM SAIRPORTWHERE ID = AP2.ENDSELECT.代码 2:SELECT * FROM SBOOK INTO SBOOK_WA UP TO 10 ROWS.SUPPLY CARRID = SBOOK_WA-CARRIDCONNID = SBOOK_WA-CONNIDTO CONTEXT TRAV1.DEMAND AIRPFROM = AP1AIRPTO = AP2NAME_FROM = NAME1NAME_TO = NAME2FROM CONTEXT TRAV1.ENDSELECT.最后是注意内存的使用,以下是内存优化方面的例子:1, 虽然ABAP拥有垃圾处理的机制,但是这个是在程序运行完成后实现的.所以我们尽量把无用的 变量,内表,对象都释放掉;2, 尽量减少无用的静态定义的变量,内表和对象, 因为静态定义的对象会在编译开始就占有内存空 间;3, 尽量减少网络的传输负载,比如在设计RFC远程调用传回的内表数据要尽量精简,数据量越大, 对CPU和内存需求越多;4, 内存使用紧张的情况下,使用FREE语句,以及SQL语句的PACKAGE SIZE n选项.SELECT vbeln erdatFROM vbakINTO TABLE li_vbak PACKAGE SIZE 50.
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号