tft每日頭條

 > 圖文

 > apm工具的質量

apm工具的質量

圖文 更新时间:2024-12-01 14:33:35

apm工具的質量(ABAP程序優化的一些總結)1

賽銳信息,SAP ERP定制,ERP定制

第一部分 程序運行時間的優化

優化的重點之一是運行時間,影響運行時間的因素有很多,首先程序本身的話,從CPU角度講,指令越少自然運行時間越快,會引發CPU大量操作的基本上主要就是對數據量非常大的内表進行循環處理(LOOP)的時候,下面列舉一些比較有效的可以優化的地方:

嵌套循環(NESTEDLOOP),如果外循環有N條記錄,内循環有M條記錄,那麼總的循環次數就是N*M,這是需要避免或者優化的,一個比較常用的方法是在LOOP後面加上WHERE條件,這樣可以避免了全表循環,在一些特殊場合(比如排序過的内表),可以使用一些編程技巧用INDEX FROM TO直接指定需要LOOP的内表所在行。

二分法查找(BINARYSEARCH):假如LOOP裡有需要用到READ TABLE去查詢另外一個内表裡的某條記錄,那麼先對那個内表進行需要比較的KEY值的排序,再用BINARY SEARCH能顯著提高查詢速度。如果不指定BINARY SEARCH關鍵字,系統會按順序作全表掃描和比較,掃描一個有N條記錄的内表,在最壞情況下需要比較N次(假如所需要的記錄正好在内表的最後一條),而用BINARYSEARCH查找是折半查找,則隻需要比較LOGN次。比如當N是100萬時,普通查找最多可能查找100萬次,而折半查找最多隻需要查找20次。

FIELD-SYMBOL:LOOP時使用FS來代替結構(工作區),這樣的好處是直接定位到内表的某條記錄,而不是複制這條記錄到結構裡(所以在修改内表内容時,使用指針不需要MODIFY命令,因為指針是直接修改内表的内容,而結構隻是内表當前行的一個拷貝,修改完結構之後需要通過MODIFY複制回内表)。同樣的READTABLE也一樣可以ASSIGNING到一個指針裡,但是和LOOP不同的是,LOOP ASSIGNING是必定成功的,而READ TABLE ASSINGING可能失敗,當失敗時,這個指針是不能使用的,不然運行時會發生指針未分配的DUMP。建議可以定義一個同類型的結構(初始值),如果READ TABLEASSIGNING失敗,就把指針分配到這個結構裡。*使用指針來進行LOOP基本上總是有利的且沒有什麼副作用,但是個人認為從原理上看,有的時候可能優化的重點并不是LOOP時用指針去代替結構,假如LOOP裡的數據處理才是重點的話,那麼省去複制到結構的這步操作也不會對運行時間産生很大的影響。

數據庫操作:這點其實屬于數據庫開銷的方面的優化。LOOP裡基本不允許SELECT,一次完整的SELECT所需要的時間相對是較多的(可能隻有零點零幾秒,但是一旦循環幾十萬上百萬次的話……),一般是先用FOR ALL ENTIRES把全部數據讀入另外一個内表,然後和LOOP裡面READ TABLE(BINARY SEARCH)來代替。同理在作INSERT和UPDATE的時候,也盡量通過内表批量處理,避免在LOOP裡根據結構作單條插入或更新。*這樣做雖然提升了時間上的效率,但内存和數據庫傳輸數據開銷是增加了,因為需要從數據庫讀入更多的數據到内表,可能導緻内存不夠的問題,具體會在後面的内存空間相關的部分講。

調用功能模塊(Function Module)和方法(Method):有的時候會在LOOP裡調用标準的FM,标準的FM通常比較複雜,内部有多層次的調用,裡面可能會有SELECT語句,這種情況下可以自己寫邏輯從數據庫取數來代替調用标準FM。

并行處理(Parallel Processing):并行處理是指開多個進程同時處理,SAP有多種進程,前台進程(DialogProcess)和後台進程(BackgroundProcess)是其中的兩種,并行可以分為前台并行(占用前台進程)和後台并行(後台進程),前者采用異步RFC,關鍵字CALLFUNCTION STARTING NEW TASK,後者采用JOB OPEN和SUBMIT VIA JOB的方法。并行處理是在處理大量數據時非常有用的方式,除了可以顯著地提升時間效率之外,也可以解決單個進程有最大内存的限制。但是并行也有局限性,比如說同時處理的數據不能有邏輯上的關聯性,而且每個進程的執行先後順序也是不可預料的。

第二部分 内存空間的優化

SAP Unicode程序,一個C類型的字符占用兩個字節(2Byte)。内存設置方面,分配給一個前台進程(Dialog Process)默認是4000000000字節(2000000000的Extended Memory和2000000000的Heap Memory,這個大小可以調整),也就是不到4GB的内存空間,當一個内表的行結構是512個字符(1024個字節時),最多大約可以容納400萬條不到的記錄數,如果超過了這個容量,就會發生DUMP或者程序強制關閉。

解決方法是SELECT取數時改為使用SELECT PACKAGE SIZE ENDSELECT分包取出并處理,這樣可以在規定的内存大小内完成數據的處理。但是這種方法依然有個小問題,就是在SELECT和ENDSELECT裡不支持并行進程(從原理上講并行會涉及到進程切換,進程切換時會觸發一個COMMITWORK,而在SELECTENDSELECT裡這是不允許的),如果要達到分包取數并且并行處理的效果,就需要使用OPEN CURSOR和FETCH。

關于賽銳信息

作為SAP的資深合作夥伴,賽銳信息是一家專業提供SAP行業化管理軟件解決方案的顧問公司,緻力于為企業提供SAP ERP系統咨詢服務、IT規劃、業務流程優化、信息系統實施、行業信息系統方案開發,運營外包及售後維護等全面的服務方案。已服務1000 家不同行業、規模的大中小型企業客戶。在電子高科技、汽車零部件、印刷包裝、醫療器械、快消品、專業服務等行業信息化管理領域具有領導性地位。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved