如何提高ABAP程序运行效率

如何提高ABAP程序运行效率,第1张

程序效率是每个程序员都应该重视的,无论您是采用哪一种语言进行开发 程序有时候越短,并不

一定越快,有时候程序很多代码,但不一定会很慢 性能是一把双刃剑, 获得时间效率的同时, 牺牲

的是空间的开销 这里提供一些建议以提高你的程序运行速度和减低系统荷载。

首先是尽量减少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和SELECTENDSELECT里面用, 应该把要读取

的数据用SELECT FOR ALL ENTRIES IN 一次全部取得, 然后用READ TABLE WITH KEY BINARY

SEARCH

虽然说 *** 作内存比磁盘 *** 作要高效,但是如果对内存的使用不加以控制,可能有些时候不得不对硬盘

的交换空间 *** 作, 这样就增加了对磁盘的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 WHERE

BUKRS = '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 ALL

ENTRIES IN 以及 READ TABLE WITH KEY BINARY SEARCH例如我们要提高读取BSEG表的性能,首先我

们会根据GJAHR主键从BKPF表取出部分数据到内表itab,然后使用FOR ALL ENTRIES IN itab WHERE

BSEG~BELNR = itab~BELNR 这样的的方法取得符合itab里所有条件的BSEG数据注意使用FOR ALL

ENTRIES要先CHECK作为条件的内表itab是否为空,还有作为WHERE的条件在这个内表里面是否会有空

值存在,否则无效

6, 注意使用CORRESPONDING FIELDS OF 和 MOVE-CORRESPONDING 时候会进行字段比较, 带来CPU的

开销大

7, 避免过得而频繁的数据类型转换,比如N转换为C,但是从N转换成STRING却是很快的,因为 *** 作

STRING比CHAR类型少了比较长度的时间

8, 使用二级索引提高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 SPFLI

WHERE CARRID = SBOOK_WA-CARRID

AND CONNID = SBOOK_WA-CONNID

SELECT SINGLE NAME INTO NAME1 FROM SAIRPORT

WHERE ID = AP1

SELECT SINGLE NAME INTO NAME2 FROM SAIRPORT

WHERE ID = AP2

ENDSELECT

代码2:

SELECT FROM SBOOK INTO SBOOK_WA UP TO 10 ROWS

SUPPLY CARRID = SBOOK_WA-CARRID

CONNID = SBOOK_WA-CONNID

TO CONTEXT TRAV1

DEMAND AIRPFROM = AP1

AIRPTO = AP2

NAME_FROM = NAME1

NAME_TO = NAME2

FROM CONTEXT TRAV1

ENDSELECT

最后是注意内存的使用,以下是内存优化方面的例子:

1, 虽然ABAP拥有垃圾处理的机制, 但是这个是在程序运行完成后实现的 所以我们尽量把无用的变

量,内表,对象都释放掉;

2, 尽量减少无用的静态定义的变量,内表和对象, 因为静态定义的对象会在编译开始就占有内存空

间;

3, 尽量减少网络的传输负载, 比如在设计RFC远程调用传回的内表数据要尽量精简, 数据量越大,对

CPU和内存需求越多;

4, 内存使用紧张的情况下, 使用FREE语句, 以及SQL语句的PACKAGE SIZE n 选项

SELECT vbeln erdat

FROM vbak

INTO TABLE li_vbak PACKAGE SIZE 50

兼顾程序的正当性和效率方法:

1、理想的程序必须兼顾结果的有效性、形式公正、个人尊严与效率,在几种价值间谋求平衡。应根据某一特定历史时期的特殊形势,以其中之一为中心而兼顾其他,以时间上的总体平衡代替空间上的总体平衡。

2、程序公正和效率是任何一个社会都必须信守的价值。但如何处理程序公正与效率的关系却是一个困难的问题。理想的程序必须兼顾结果的有效性、形式公正、个人尊严与效率,在几种价值间谋求平衡。应根据某一特定历史时期的特殊形势,以其中之一为中心而兼顾其他,以时间上的总体平衡代替空间上的总体平衡。

3、程序公正就是要严格执行法定的审判原则、审判程序,充分保障当事人及其他诉讼参与人的诉讼权利。而追求效率的目的也是让当事人及其他诉讼参与人以尽可能少的时间和费用实现案件的公正审结,从而避免迟来的公正。

从根本上了解算法是怎么执行的,这样可以做到一通百通。

一般来说,降低时间复杂度是比较好的方法。 有时候,占用更多的内存可以帮助程序更快的运行。还有就是选用效率高的语言,例如C。

现在网上常看到很多的文章,是写关于程序员怎样提高工作效率的。有些看看还是有用的,但有些还是不要盲目学的好,事后在想,我也可以写点这方面的内容,以自己的成功经验为案例,希望可以帮到大家,当然,我也不想浪费太多的时间来说和让大家学着做,而且北大青鸟认为所写的这几个观点对我个人还是有效的,但不一定对大家也一样有效,如果也一样对某些人有效,那么,很高兴就够帮到你。

1不要犹豫,有时断一下网是很有必要的。

说实话,再也没有比这个更好的了,而且效果非常明显,因为,如果你想要好好的静下心来工作,那么,把网断了,手机最好也静音,要使用的编程语言和编程工具用离线版本的就好了,真要是有什么确实解决不了的难题用手机搜就好了,不过我也知道这时用电脑更快捷些,但对于那些不自觉,只要上网就停不下来人来说,还是不要用电脑搜的好。

2目标要明确

如果同时有几个项目要完成,你是不是就觉得不知道要从那里入手了,我要说的是,不要自己乱了,先从中做个排序,把几个项目从重到轻例个表出来,然后再一个一个的完成。所以大家不要想着你可以一次都能做完,这样可能会导致于最后一事无成,一定要明确规划好目标。

3休息和睡眠要充足

不是一定要不停的工作才会出高效率,适当的休息后再工作可能会效率更高,因为长时间的工作可能会出现疲倦感,这样会让你很难集中精力好好工作,这时你可以停下手上的工作做些别的事情,可以闭目养神,也可以听听音乐,站起来望下窗外,随你喜欢,做些什么都是可以的,另一个就是,到了晚上该睡觉的时候是一定要睡觉的,不然你的程序员生涯就不长了。

4做好提前计划

这个绝对是实践后得到的好结果,我试过在当天的工作都完成后,为第二天的工作做了个计划,结果到了第二天发现效果太棒了,当你坐下来打开电脑就能很快的进入到工作的进程中,因为前一天的计划已经让你的脑子很清楚先做什么后做什么。如果当天有些工作没完成就更应该记录下来,特别是在周五的时候,因为我总是在周一上班时脑袋是蒙的,有一小段时间是不知道自己该做什么,所以提前记录当天没完成的工作是对下次工作很好的交代,做好提前计划也是对第二天工作的一个很好的开展。这样你的工作效率会大大的提高是显而易见的。

5如果有时间,可以来点下午茶或是咖啡什么的。

有时,不管是来点茶还是咖啡都有可以提高我们的工作效率,不过这也不是绝对的,还是要因人而异,又或者是来些其他的小零食也是不错的选择。

1、尽量少写 多层的for嵌套,影响效率。 2、用memcache或者其他缓存技术,将常用的 数据字典数据缓存到内存中,也可以缓存到文本文件中,节省数据库连接数量及数据库的资源。 3、尽可能少的去连接数据库,减少连接数量。

以上就是关于如何提高ABAP程序运行效率全部的内容,包括:如何提高ABAP程序运行效率、如何尽可能兼顾程序的正当性和效率、如何改进算法,提高程序效率等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9265714.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存