[SAP ABAP開發技術總結]ABAP調優——代碼優化


 

11.2.     程序

1.   READ TABLE ...WITH [TABLE] KEY...BINARY SEARCH讀取標准內表使用二分查找

2.   循環(LOOP AT ...WHERE..)或查詢READ TABLE ...)某內表時,如果未使用索引(排序表、哈希表)或二分查找,則在查詢組合字段創建第二索引查詢時通過USE KEYWITH [TABLE] KEY選項使用第二索引,這樣在查詢時會自動進行二分查找或哈希找查

在沒有用二分查找的情況下,可在查詢組合字段上創建第二索引(哈希或排序索引),則在讀取或循環內表時會自動使用二分查找或哈希查找算法

3.   查找時,優先考慮使用哈希表進行查找,再考慮使用排序表進行二分查找因為哈希查找的時間復雜度為(O (1)),不會因數據的增加而受到影響;而二分查找雖然比順序搜索快很多,但隨着數據的增加會慢下來,其時間復雜度為(O (log2n));標准內表的時間復雜度為O(n)。注:如果只使用到部分關鍵字為搜索條件,哈希表則會全表掃描,此時應該使用二分找查

4.   FOR ALL ENTRIES:需要判斷內表是否為空,否則會查詢出所有數據

5.   LOOP AT itab... ASSIGNING ...READTABLE ...ASSIGNING ... 在循環或讀取內表時,使用字段符號來替換表工作區,將數據分配給字段符號Field Symbols減少數據來回傳遞

6.   盡量避免嵌套循環,如必須時,將循環次數少的放在外層,次數多的放在內層,這樣可以減少在不同循環層之間的頻繁地切換及內部循環次數

7.   條件語句中多使用短路與或,“與”連接時將為假的機率大的條件放在前面,“或”連接時將為真的機率大的條件放在前面

8.   少使用遞歸算法,遞歸時會增加調用棧層次,降低了性能,可使用隊列或棧來避免遞歸

9.   盡量不要使用通用類型(如FIELD-SYMBOLS、及形式參數),使用具體限定類型;比較時盡量使用同一數據類型:IF c = c.IF i = c.快,原因是未發生類型轉換

10.不要使用混合類型進行計算與比較,除非有必須

11.盡量使用靜態語句,少用動態編程,動態編輯雖然靈活,但性能有所下降

12.在對字符進行操作進,盡量使用String代替C固定長度類型,如:concatenate[kənˈkatɪneɪt]語句對固定長度的C連接時,會去掃描那些非空字符出來再進行連接,速度沒有String

13.READ/MODIFY TABLE時使用TRANSPORTING只讀取或修改必要的字段 [trænsˈpɔ:t]

14.盡量避免使用MOVE-CORRESPONDINGSELECT...INTO CORRESPONDING FIELDS OF [TABLE](SELECT時,查詢幾個字段就定義具有這幾個字段的內表,而不是直接使用基於數據庫表類型創建的內表,否則如果直接使用 INTO TABLE語法檢查時會警告,但結果是沒有問題的)CORRESPONDING語句在系統內部存在隱式操作: 逐個字段的檢查元素名稱匹配; 檢查元素類型匹配;元素類型轉換[ˌkɔrisˈpɔndiŋ] 

15.最好不要向排序內表中插入INSERT ... INTO TABLE ...數據,因為在插入時會進行排序,速度會隨着數據量的增加而慢下來,所以最好只向標准內表或哈希表中插入數據

16.將某個內表中的全部記錄或部分記錄追加到另一內表時,使用INSERT/APPEND LINES OF … 代替循環逐條追加;如果是全新賦值,直接對內表使用“=”進行賦值操作即可

17.調用類方法要快於Function

Calling Methods of global Classes    call method CL_PERFORMANCE_TEST=>M1.

Calling Function Modules         call function 'FUNCTION1'.

18.通過運行事務代碼SLIN(或者直接通過SE38的菜單),進行代碼靜態檢查,根據SAP提供的反饋信息,優化代碼

19.      通過老式方式定義內表時,使用OCCURS 0 而非OCCURS n [əˈkə:s]  重現

l  OCCURS n 代表初始化內表的空間大小為n(空間固定),當內表存儲記錄條數超出n時,系統將依靠頁面文件存放超出部分的數據 當系統內存資源十分緊缺的時候, 我們可以使用OCCURS n的初始化方法, 但是這樣的效率稍微慢

l  OCCURS 0 代表初始化內表的空間大小為無限,當內表存儲記錄條數不斷增加時, 內表所使用的內存空間不斷擴大, 直到系統無法分配為止。 使用內存比使用頁面交換更快一些 但是要考慮系統的資源狀態

20.使用完成后及時清空釋放內表所占用的空間:FREE <itab>.

21.使用CASE…WHEN語句代替 IF…ELSEIF…;使用WHILE…ENDWHILE 代替 DO…ENDDO

22.LOOP循環內表時加上Where條件減少CPU負荷,而不是在循環里通過IF語句來過濾數據


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM